无法在Rails中使用照片

时间:2016-05-29 18:04:56

标签: ruby-on-rails carrierwave

我在执行一项简单的任务时遇到各种各样的麻烦,将照片显示为每个结果集的一部分。一般来说,我对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 %>

2 个答案:

答案 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>

  ......