Использование делегата с has_many в Rails?

Мы'у нас есть 2 модели и модель соединения:

#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

Дополнительные атрибуты

Мы'ищем, чтобы извлечь дополнительные атрибуты из модели соединения (ImageMessage) и сделать их доступными вMessage модель:

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

Мы'мы уже достигли этого, используяselect метод при объявлении ассоциации:

#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

делегат

Мы'мы только что нашлиdelegate метод, который делает именно то, что нужно. Тем не менее, это только кажется, что работает наhas_one а такжеbelongs_to ассоциации

Мы только что получили это, работая с одной ассоциацией, но кажется, что это не работает для коллекций (просто приводит вас к публичному методу)

Вопрос

Вы знаете, каким образом мы могли бы вернуть.caption атрибут изImageMessage присоединиться к модели черезImage модель?

У нас есть это в настоящее время:

#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

Обновить

Благодаря Билли Чану (за идею метода экземпляра) у нас все получилосьочень ориентировочно:

#app/models/image.rb
Class Image < ActiveRecord::Base
    #Caption
    def caption
        self.image_messages.to_a
    end
end

#app/views/messages/show.html.erb

     #-> works, but super sketchy

Любой способ рефакторинга, специально чтобы получить так, чтобы каждый раз.caption называется, он возвращаетimage_message.caption значение для этой конкретной записи?

Ответы на вопрос(1)

Ваш ответ на вопрос