2016-05-29 2 views
0

У меня возникают проблемы со сложной задачей, отображая фотографию как часть набора результатов для каждого из них. Я довольно новичок в Rails в целом, исходя из другого языка, где я могу сделать это за считанные секунды.Невозможно получить фотографии для работы в рельсах

Запрос @photo находит 0 записей, даже если несколько записей для фотографий находятся в базе данных, соответствующей идентификатору свойства.

Я не слишком уверен, что я здесь делаю неправильно.

Вот мои соответствующие файлы:

приложение/контроллеры/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 

приложение /models/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 %> 

ответ

1

Поскольку у вас есть has_many realtion в Property, вы должны просто получить доступ к соотношению собственности читать все Teh Фото:

photo = @property.photos.order("position").first 

Ну, если вам нужно захватить все фотографии свойств, используйте их в свойствах захвата:

@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..., должен быть лучше перемещен в декоратор (см. Драгоценный камень draper).

+0

Когда я делаю это из Вашего комментария выше: @photo = Photo.where. (PROPERTY_ID: @ property.id) .order ("Положение") предел (1), я получаю сообщение об ошибке ... NoMethodError в PropertiesController # all ... undefined method 'id 'for nil: NilClass – lmtony

+0

Когда я это делаю: @photo = @ property.photos.order (" position "). Сначала я получаю сообщение об ошибке ... NoMethodError в PropertiesController # all ... undefined method 'photos 'for nil: NilClass – lmtony

+0

ОК. Поэтому я включил для @properties и @photos с properties.map ... Я заменил вызов фотографии на странице сведений с помощью <% = image_tag (property.photos.photoname.medium)%> и получил эту ошибку. undefined метод 'photoname 'для # <Фото :: ActiveRecord_Associations_CollectionProxy: 0x007f30c45975f8> – lmtony

0

После TON помощь @ МалъСкрылевъ, который также имел меня обучение несколько новых способов «думать» это в общем, его ответ привел меня переосмыслить то, что я делаю, и вернуться, чтобы просто начать сначала и реконструируя то, что оказалось ОЧЕНЬ основным. Все, что мне нужно было сделать, это сделать фото-запрос для первой фотографии в моей петле над свойствами. ДУХ! Вот что я сделал в случае, если это поможет другим бедным новым разработчикам 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.Еврорадио

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

    ...... 
Смежные вопросы