【问题标题】:Ruby has_many model association not workingRuby has_many 模型关联不起作用
【发布时间】:2016-04-22 13:34:53
【问题描述】:

这里有两个表propertiesproperty_images 我想关联这两个表。

属性

id
name
status
other-columns-here

property_images

id
property_id
image
status

这里是代码 -

class Property < ActiveRecord::Base
  has_many :property_images, dependent: :destroy
end


class PropertyImage < ActiveRecord::Base
  belongs_to :property
end

users_controller.rb

def index
   @properties = Property.order('id');
   render html:@properties #13 properties coming
end

我尝试过has_many 关联,但只收到properties 数据。请帮帮我

【问题讨论】:

  • 你想在每个属性中包含属性图像吗?
  • 是的,我想在 has_many 关联中包含每个属性
  • 您实际问的是英文并不清楚。我的意思是没有冒犯(我的妻子是外国人,对这个问题非常熟悉:)但也许尝试改写这个问题。您上面的代码成功地“关联”了这两个表。我会质疑为什么“用户”控制器中的索引显示属性。也许您需要使用嵌套属性?您如何加载 Property 和 PropertyImage 数据?
  • @Chinu 如果有任何答案对您有帮助,请将其标记为已接受的答案:)

标签: ruby-on-rails ruby activerecord model-associations


【解决方案1】:

这两个模型是正确关联的,但是,如果你想访问property_images而不在视图中进行任何额外的查询,你可以通过以下三种方法来实现:

@properties = Property.includes(:property_images)

@properties = Property.eager_load(:property_images)

@properties = Property.preload(:property_images)

您可以在下面的blog 中阅读有关 eagerloading/preloading 的更多信息

您还可以为您的属性模型添加范围,以便更轻松地访问它们(通过不一遍又一遍地重复相同的代码来节省一点时间)。

在您的属性模型中添加以下内容

scope :with_property_images,-> {joins(:property_images)}

然后您可以通过调用上述范围来访问带有预加载图像的属性。

更新:如果您使用的是 rails 4,则范围必须包含在 lambda 中。我已经更新了范围代码,它应该适用于轨道 3 和 4。

【讨论】:

  • 当我在渲染 properties 时,property_images 记录不会出现
  • 能否发布您正在使用的当前代码和输出 (@properties.inspect)。
  • 渲染 html:@properties.inspect
  • 你如何调用 with_property_images 范围?
【解决方案2】:

试试这个控制器

# controller.rb
def index
   @properties = Property.includes(:property_images)
end

并查看

#view.html.erb
<% @properties.each do |p| %>
   <% p.property_images.each do |image| %>
      <%= image.id %>
   <% end %>
<% end %>

【讨论】:

    【解决方案3】:

    试试下面的:

    def index
       @properties = Property.includes(:property_images).order('id');
       #render html:@properties #13 properties coming
    end
    

    查看图片:

     <% @properties.each do |p| %>
       <% p.each do |image| %>
          view image & data
       <% end %>
    <%end%>
    

    【讨论】:

    • &lt;% p.each do |image| %&gt; view image &amp; data &lt;% end %&gt; 不工作。
    • #<0x765f330>
    【解决方案4】:

    我认为您需要在查询属性时使用 :include => :property_images 来预先加载

    您可以将其放入查询的参数中。可能只需要使用 Property.find

    【讨论】:

    • 我将在哪里使用:include =&gt; :property_images
    【解决方案5】:

    尝试以下控制器并查看

    # users_controller.rb
    def index
       @properties = Property.includes(:property_images).order(:id)
    end
    

    在你看来,你需要把每个 for property_images 而不是 property,

    #properties.html.erb
    <% @properties.each do |p| %>
       <% p.property_images.each do |image| %>
          <%= image.id %>
       <% end %>
    <% end %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多