Ruby has_many 模型关联不起作用
Ruby has_many model association not working
这里有两个tableproperties
和property_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 %>
这里有两个tableproperties
和property_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 %>