Usando delegar com has_many no Rails?

Temos 2 modelos e um modelo de junção:

#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 extras

Estamos procurando extrair os atributos extras do modelo de junção (ImageMessage) e tê-los acessíveis noMessage modelo:

@message.image_messages.first.caption # -> what happens now    
@message.images.first.caption #-> we want

Já conseguimos isso usando oselect método ao declarar a associação:

#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 odelegate método, que faz exatamente o que isso precisa. No entanto, apenas parece funcionar parahas_one ebelongs_to associações

Acabamos de trabalhar com uma única associação, mas parece que não funciona para coleções (apenas leva você a um método público)

Pergunta, questão

Você conhece alguma maneira de devolver o.caption atributo doImageMessage juntar modelo através doImage modelo?

Temos isso atualmente:

#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

Atualizar

Graças a Billy Chan (pela ideia do método de instância), nós conseguimosmuito provisoriamente:

#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 %>

Qualquer maneira de refatorar, especificamente para obtê-lo para que cada vez que.caption é chamado, retorna oimage_message.caption valor para esse registro específico?

questionAnswers(1)

yourAnswerToTheQuestion