2012-08-18 3 views
0

Это следует из более раннего вопроса, поскольку я изгибаю свой мозг вокруг Ruby on Rails.Тестирование на отсутствие связанных объектов в Ruby on Rails

У меня есть элементы, которые отображаются на веб-странице, в зависимости от того, разрешает ли их статус отображение или нет, с использованием именованной области - если статус документа («Продажа», «Продано», «Удалено» и т. Д.) Имеет show_latest_items флаг установлен в 1, это позволит связанные элементы, которые будут отображаться на странице:

class Item < ActiveRecord::Base 
    belongs_to :status 
    scope :show_latest_items, joins(:status).where(:statuses => {:show_latest_items => ["1"]}) 
end 

class Status < ActiveRecord::Base 
    has_many :items 
end 

Это, как он отображается в данный момент

<% latest_items = Items.show_latest_items.last(30) %> 
<% latest_items.each do |i| %> 
    : 
<% end %> 

Так что это все хорошо, но я теперь хочу показывать только элемент, если у него есть связанная фотография.

class Item < ActiveRecord::Base 
    has_many :item_photos 
end 

class ItemPhoto < ActiveRecord::Base 
    belongs_to :item 
end 

Так что в моем сознании, я должен, используя названный объем, быть в состоянии потянуть назад список элементов для отображения, а затем фильтровать их с помощью .present? или .any? методы. Любопытно, что это:

<% latest_items = Items.show_latest_items.where(:item_photos.any?).last(30) %> 

возвращает ошибку:

undefined method `any?' for :item_photos:Symbol 

Принимая во внимание:

<% latest_items = Items.show_latest_items.where(:item_photos.present?).last(30) %> 

не ошибка, но не отфильтровывать элементы без каких-либо фотографий, либо ,

Я пробовал различные другие методы, а также пытался делать пользовательские находки, называя области имен для фотографий, но ничего не имеет большого смысла. Должен ли я приближаться к этому под другим углом?

ответ

2
:item_photos.any? 

Это не работает, потому что Руби Symbol не имеет any? метод.

.where(:item_photos.present?) 

Это не делает фильтрацию вы после этого, потому что вы звоните .present? на Symbol :item_photos, который оценивает в true, что делает условию действительно

.where(true) 

Попробуйте просто

<% latest_items = Items.show_latest_items.joins(:item_photos).last(30) %> 

SQL для этого .joins(:item_photos) будет INNER JOIN, в результате чего Item ins которые не были связаны с ItemPhoto экземплярами, которые должны быть исключены из результата.

+0

Работает как сон и прекрасно объясняется. Спасибо! (У меня было много чего узнать ...) –

+0

Ах, один побочный эффект: если есть несколько фотографий, он объединяется несколько раз и поэтому возвращает элемент строки несколько раз. –

+1

Вы можете попробовать добавить что-то вроде '.group (" items.id ")' перед '.last (30)' – deefour

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