我在执行一项简单的任务时遇到各种各样的麻烦,将照片显示为每个结果集的一部分。一般来说,我对Rails很陌生,来自另一种语言我可以在几秒钟内完成。
@photo
查询找到0条记录,即使照片的多条记录位于与属性ID匹配的数据库中。
我不太确定我在这里做错了什么。
以下是我的相关文件:
应用/控制器/ properties_controller.rb :
class PropertiesController < ApplicationController
......
def all
# gets all of the properties and uses will_paginate
@properties = Property.paginate(page: params[:page])
# should get the first positioned photo matching the results in the @properties query
@photos = Photo.where(:property_id => @properties.map(&:id)).order("position").first
end
# ......
end
应用/模型/ property.rb :
class Property < ActiveRecord::Base
belongs_to :listing_type
belongs_to :property_type
belongs_to :status
has_many :photos
# ......
end
应用/模型/ photo.rb :
class Photo < ActiveRecord::Base
mount_uploader :photoname, PhotoUploader
belongs_to :property
acts_as_list scope: :property_id
validates :photoname, presence: true
validates :property_id, presence: true
end
details.html.erb :
<% @properties.reverse_each do |property| %>
<div class="item col-md-4">
<div class="image">
<%= link_to property_path(property) do %>
<span class="btn btn-default"><i class="fa fa-file-o"></i> Details</span>
<% end %>
<%= image_tag(property) %>
</div>
# ......
<% end %>
答案 0 :(得分:1)
由于您在has_many
中有Property
个实现,您只需访问该属性的关系即可阅读所有照片:
photo = @property.photos.order("position").first
如果您需要获取所有属性的照片,请使用include to properties grab:
@properties = Property.includes(:photos).paginate(page: params[:page]).reverse
avoid N + 1
problem需要包含,然后尝试用第一张照片替换它:
@photos = @properties.map { |pr| pr.photos.order("position").first }
Mpve reverse
到控制器,并使用@photos
和@properties
使用索引:
<% @properties.each.with_index do |property, i| %>
#...
<%= image_tag(@photos[i]) %>
<- end >
注意,选择图片pr.photos...
的代码最好转移到装饰器(请参阅gem draper
)。
答案 1 :(得分:0)
在@МалъСкрылевъ的帮助 TON 后,我也学习了一些新的“思考”这个方法,他的回答让我重新思考我在做什么并回到简单地重新开始并重建最终非常基本的东西。我需要做的就是在我的循环中对属性的第一张照片进行照片查询。 DUH!这是我所做的,以防它帮助其他一些可怜的新Rails开发人员!
properties_controller.rb
class PropertiesController < ApplicationController
......
def all
# gets all of the properties and uses will_paginate
@properties = Property.paginate(page: params[:page])
......
end
details.html.erb
<% @properties.each do |property| %>
<div class="item col-md-4">
<% @photo = Photo.where(property_id: property.id).order("position").first %>
<div class="image">
<%= link_to property_path(property) do %>
<span class="btn btn-default"><i class="fa fa-file-o"></i> Details</span>
<% end %>
<%= image_tag(@photo.photoname.medium) %>
</div>
......