Rails确定has_many:通过访问额外数据

时间:2013-11-27 18:49:37

标签: ruby-on-rails ruby-on-rails-4

众所周知,在rails中,您可以为has_many :through联接模型添加额外的属性

我想从连接模型中提取额外数据&用它填充视图。我通过直接引用连接模型来实现这一点,但是我想将相关的连接模型数据附加到当前项目,如下所示:

#app/models/message.rb
    #Images
    has_many :image_messages, :class_name => 'ImageMessage'
    has_many :images, :class_name => 'Image', :through => :image_messages, dependent: :destroy

   #app/views/messages/show.html.erb
   <%= @message.image_messages.first.caption %> #-> works

   #app/views/messages/show.html.erb
   <%= @message.images.first.caption %> #-> what I'd like to happen

具体来说,我需要能够调用特定图片的captioncaption存储在image_messages联接模型中,如下所示:

#image_messages join table
id | message_id | image_id | caption | created_at | updated_at

从我所看到的,也许可以使用范围,但我不确定

任何帮助将不胜感激! 我想我会问这个问题,因为这是你经常得不到的那个!

1 个答案:

答案 0 :(得分:0)

我实际上找到了这个

的解决方案

神奇之处在于SQL SELECT语句,我设法在this RailsCast

上找到了该语句

具体而言,除了标准SELECT * FROM table之外,您还可以定义另一个函数,并使用AS函数将其附加到原始查询

所以我得到的是这段代码:

#Images
    has_many :image_messages, :class_name => 'ImageMessage'
    has_many :images, -> { select("#{Image.table_name}.*, #{ImageMessage.table_name}.caption AS caption") }, :class_name => 'Image', :through => :image_messages, dependent: :destroy

这允许您附加&#34;标题&#34;对于Image对象的图像,允许您调用@image.caption - 它的工作非常出色!