Ruby has_many模型关联不起作用

时间:2016-04-22 13:34:53

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

这是两个表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数据。请帮帮我

5 个答案:

答案 0 :(得分:1)

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

@properties = Property.includes(:property_images)

@properties = Property.eager_load(:property_images)

@properties = Property.preload(:property_images)

您可以在以下blog

中详细了解预先加载/预加载

您还可以在属性模型中添加范围,以便更轻松地访问它们(并且不会一遍又一遍地重复相同的代码,从而节省一点时间。)

在您的房产模型中添加以下内容

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

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

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

答案 1 :(得分:1)

试试这个控制器

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

答案 2 :(得分:0)

我认为您需要使用:include =&gt; :property_images在查询属性时急切加载

你会把它放在查询的参数中。可能只需要使用Property.find

答案 3 :(得分:0)

尝试以下方法:

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

答案 4 :(得分:0)

尝试以下控制器并查看

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