0

这是我之前的一个问题的后续,因为我正在围绕 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) %>

不会出错,但它也不会过滤掉没有照片的项目。

我尝试了各种其他方法,以及尝试自定义查找器、为照片编写名称范围,但没有什么意义重大。我应该从不同的角度来解决这个问题吗?

4

1 回答 1

2
:item_photos.any?

这不起作用,因为 Ruby 的Symbol没有any?方法。

.where(:item_photos.present?)

这不会执行您所追求的过滤,因为您正在调用评估为.present?的 Symbol ,从而使条件真正:item_photostrue

.where(true)

尝试简单

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

用于此的 SQL.joins(:item_photos)将是INNER JOIN,导致结果中省略Item没有关联实例的实例。ItemPhoto

于 2012-08-18T18:00:03.057 回答