5

レールを使ってこのようなクエリを実行することは可能ですか?

SELECT items.*, (select count(*) from ads where item_id = items.id) as adscount WHERE 1

そして、そのようにこのフィールドにアクセスしますか?

@item.adscount 

たとえば、各アイテムには100個ほどの広告があります。また、アイテムのインデックスビューで、各アイテムに含まれる広告の数を表示する必要があります。

今のところ、私はすべてのアイテムに対して一意のクエリを作成する方法を見つけただけです。たとえば、次のようになります。

select count(*) from ads where item_id = 1
select count(*) from ads where item_id = 2
select count(*) from ads where item_id = 3
etc

編集:

カウンターキャッシュ列を作成しました。

これにより、パフォーマンスが大幅に向上しました。

4

3 に答える 3

1

1 つの解決策はScopesを使用することです。次のような特別なクエリにすることもできます

class Item < ActiveRecord::Base
  scope :with_adscount, select("items.*, (select count(*) from ads where item_id = items.id) as adscount")
end

次に、コントローラーで、またはどこからクエリを実行しても、次のように使用できます。

@items = Item.with_adscount
@items.each do |item|
  item.adscount
end

または、次を使用してデフォルトのスコープとして配置できます。

class Item < ActiveRecord::Base
  default_scope select("items.*, (select count(*) from ads where item_id = items.id) as adscount")
end
于 2013-01-14T05:22:31.113 に答える
0
于 2013-01-14T06:30:35.427 に答える
0

このようにコントローラーでそれを行うことができます

a = MyModel.find_by_sql('SELECT *, (select count(*) from table) as adscount FROM table').first
a.adscount #total
a.column1 #value of a column
a.column2 #value of another column
于 2013-01-14T07:33:54.980 に答える