0

これは、Ruby on Rails について頭を悩ませているので、以前の質問に続きます。

ドキュメントのステータス(「販売中」、「販売済み」、「削除済み」など)に show_latest_items フラグが設定されている場合、名前付きスコープを使用して、ステータスが表示を許可するかどうかに応じて、Web ページに表示されるアイテムがあります。 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 に答える