5

是否可以使用rails进行这样的查询?

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

然后像这样访问这个字段?

@item.adscount 

例如,每个项目有一百个左右的广告。在项目索引视图中,我需要显示每个项目有多少广告。

现在我只知道如何对每个项目进行唯一查询,例如:

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

一种解决方案是使用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

使用 Rails Counter Cache http://railscasts.com/episodes/23-counter-cache-column

然后您将能够像使用它一样使用它@item.ads.count,这不会产生任何数据库查询。此外(如果你真的想以你的方式使用它)你可以创建一个模型方法

def adscount
  self.ads.count
end
于 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 回答