¿Usando Delegate With has_many In Rails?
Tenemos 2 modelos y un modelo de unión:
#app/models/message.rb
Class Message < ActiveRecord::Base
has_many :image_messages
has_many :images, through: :image_messages
end
#app/models/image.rb
Class Image < ActiveRecord::Base
has_many :image_messages
has_many :messages, through: :image_messages
end
#app/models/image_message.rb
Class ImageMessage < ActiveRecord::Base
belongs_to :image
belongs_to :message
end
Atributos extra
Estamos buscando extraer los atributos adicionales del modelo de unión (ImageMessage
) y tenerlos accesibles en elMessage
modelo:
@message.image_messages.first.caption # -> what happens now
@message.images.first.caption #-> we want
Ya hemos logrado esto usando elselect
Método al declarar la asociación:
#app/models/message.rb
has_many :images, -> { select("#{Image.table_name}.*", "#{ImageMessage.table_name}.caption AS caption") }, class_name: 'Image', through: :image_messages, dependent: :destroy
Delegar
Acabamos de encontrar eldelegate
Método, que hace exactamente lo que esto necesita. Sin embargo, solo parece funcionar parahas_one
ybelongs_to
asociaciones
Acabamos de trabajar con una sola asociación, pero parece que no funciona para colecciones (solo te lleva a un método público)
Pregunta
¿Sabes de alguna manera podríamos devolver el.caption
atributo de laImageMessage
únete al modelo a través delImage
¿modelo?
Tenemos esto actualmente:
#app/models/image.rb
Class Message < ActiveRecord::Base
has_many :image_messages
has_many :messages, through: :image_messages
delegate :caption, to: :image_messages, allow_nil: true
end
#app/models/image_message.rb
Class ImageMessage < ActiveRecord::Base
belongs_to :image
belongs_to :message
def self.caption # -> only works with class method
#what do we put here?
end
end
Actualizar
Gracias a Billy Chan (por la idea del método de instancia), lo tenemos funcionandomuy tentativamente:
#app/models/image.rb
Class Image < ActiveRecord::Base
#Caption
def caption
self.image_messages.to_a
end
end
#app/views/messages/show.html.erb
<%= @message.images.each_with_index do |i, index| %>
<%= i.caption[index][:caption] %> #-> works, but super sketchy
<% end %>
Cualquier forma de refactorizar, específicamente para conseguirlo para que cada vez..caption
Se llama, devuelve elimage_message.caption
valor para ese registro en particular?