Ruby has_many 模型关联不起作用

Ruby has_many model association not working

这里有两个tablepropertiesproperty_images我想把两个table关联起来。

属性

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 数据。请帮助我

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

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

试试下面的方法:

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%>

这两个模型已经正确关联,但是,如果您想访问 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 中。我已经更新了范围代码,它应该适用于 rails 3 和 4。

试试这个控制器

# 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 %>

尝试以下控制器并查看

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

在您看来,您需要为 property_images 而不是 属性、

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