Это следует из более раннего вопроса, поскольку я изгибаю свой мозг вокруг 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) %>
не ошибка, но не отфильтровывать элементы без каких-либо фотографий, либо ,
Я пробовал различные другие методы, а также пытался делать пользовательские находки, называя области имен для фотографий, но ничего не имеет большого смысла. Должен ли я приближаться к этому под другим углом?
Работает как сон и прекрасно объясняется. Спасибо! (У меня было много чего узнать ...) –
Ах, один побочный эффект: если есть несколько фотографий, он объединяется несколько раз и поэтому возвращает элемент строки несколько раз. –
Вы можете попробовать добавить что-то вроде '.group (" items.id ")' перед '.last (30)' – deefour