使用委托使用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_onebelongs_to关联

我们刚刚使用单个关联工作,但它似乎不适用于集合(只是带你到一个公共方法)


您是否知道我们可以通过Image模型从ImageMessage连接模型返回ImageMessage属性?

我们目前有这个:

 #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  only works with class method #what do we put here? end end 

更新

感谢Billy Chan(对于实例方法的想法),我们已经初步尝试了它:

 #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  

有什么方法可以重构,特别是为了让它每次调用image_message.caption ,都会返回该特定记录的image_message.caption值?

delegate只是一个等效实例方法的简写。 它并不是所有人的解决方案,甚至还有一些争论不是那么明确。

当简单delegate不适合时,您可以使用实例方法。

def image_message_caption image_messages.class.caption结束

我审查并发现任何关联是不必要的是这种情况。 ImageMes​​sage的类方法标题更像是一个常量,您可以直接引用它。

 def image_message_caption ImageMessage.caption end