【问题标题】:Rails Scoping For has_many :through To Access Extra DataRails 为 has_many 确定范围:通过访问额外数据
【发布时间】:2013-11-27 18:49:37
【问题描述】:

我们知道,在 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

具体来说,我需要能够调用特定图像的caption,并将caption 存储在image_messages 连接模型中,如下所示:

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

据我所见,也许可以为此使用范围,但我不确定

任何帮助将不胜感激! 我想我会问这个问题,因为它是您不经常遇到的问题之一!

【问题讨论】:

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


    【解决方案1】:

    我真的找到了解决办法

    神奇之处在于 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
    

    这允许您将图像的“标题”附加到Image 对象,允许您调用@image.caption - 它非常有效!

    【讨论】:

      猜你喜欢
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 2012-02-13
      • 1970-01-01
      • 2023-03-10
      • 2016-08-23
      • 2014-07-05
      相关资源
      最近更新 更多