3

我在这里遇到了一些问题,我无法发出 find_by_sql 请求来呈现 ActiveRecord 关系。事实上,我需要一个 activerecord 关系来提出一个新的请求:

@searches = @searches.find_by_sql('SELECT *, COUNT( follower_id ) FROM follows GROUP BY followable_id LIMIT 0 , 3') if params[:only_famous_projects]
@project_pages = @project_pages.where(:project_id => @searches.pluck(:'followable.id')) if params[:only_famous_projects]

如果没有 activerecord 关系,我就不能使用“pluck”。因此,我想我必须将我的 sql 请求转换为 Activerecord 请求。但是,一旦我在 ActiveRecord 上使用“count”,我就有一个大问题:我最后没有 ActiveRecord 关系,而是 FixNum!

我不知道在哪里可以找到答案,如果您能帮助我,我将不胜感激。谢谢

4

2 回答 2

1

find_by_sql仅当您使用 调用它时才会返回一个 ActiveRecord 对象YourModel.find_by_sql

为什么不使用 ActiveRecord 查询接口。它在计算方面做得很好。

更新

@searches = @searches.group(:followable_id).limit(3).offset(0).count(:follower_id) if params[:only_famous_projects]

请注意,它将为您提供一个包含每个 Hash 的计数followable_id

LIMIT 0, 3等于LIMIT 3

于 2012-06-20T09:03:37.213 回答
0

COUNT将始终返回一个 FixNUM,因为您要求数据库计算行数。

您真的应该尝试将find_by_sql其用作最后的手段,因为它只是为了绕过 ActiveRecord 无法完成的事情。即使对于 ActiveRecord 不支持的东西,您也可以随时查看是否可以使用SqueelValium gem 来处理边缘情况。

不使用的另一个原因find_by_sql是,例如,使用 MySQL 的特定术语会阻止您将来使用其他数据库。

于 2012-06-20T09:09:08.300 回答