Sql 何时放弃活动记录?

Sql 何时放弃活动记录?,sql,ruby-on-rails,ruby,activerecord,Sql,Ruby On Rails,Ruby,Activerecord,我对Rails并不陌生,但到目前为止我还没有做过这么复杂的事情,所以我很好奇一位更有经验的Rails开发人员会分享什么: 我有一个sql查询,它将4个左右的表连接到一个输出中: SELECT places.id, places.name, places.email, places.website, places.blurb, external_ratings.rating, photos.data_file_name FROM `scannables` INNER JOIN p

我对Rails并不陌生,但到目前为止我还没有做过这么复杂的事情,所以我很好奇一位更有经验的Rails开发人员会分享什么:

我有一个sql查询,它将4个左右的表连接到一个输出中:

SELECT places.id, places.name, places.email, places.website, places.blurb, external_ratings.rating, photos.data_file_name
    FROM `scannables` 
    INNER JOIN places ON scannables.place_id = places.id
    INNER JOIN locations ON places.location_id = locations.id
    LEFT JOIN external_ratings ON scannables.place_id = external_ratings.place_id
    LEFT JOIN photos ON scannables.place_id = photos.place_id
    WHERE locations.id = 2474 AND scannables.bookdate BETWEEN '2009-08-29' and date_add('2009-08-29', INTERVAL 4 DAY)
    GROUP BY scannables.place_id
    HAVING SUM(scannables.available) >= 4
    ORDER BY SUM(scannables.available) DESC, external_ratings.rating DESC
我在各种模型中定义了所有的表关系,最初让它仅使用这些定义的关系(使用活动记录)来拉取各种数据,它工作得很好,除了主查询(最大的查询)非常慢,执行多个indv。查询。我的问题是,在这种情况下,我是否应该转储活动记录并使用find_by_sql。。。还是我遗漏了什么

铁路怎么走


谢谢

务实比担心保持“Rails的纯洁性”更重要。我喜欢命名范围、关联,以及所有与之相关的魔力。当然,我更喜欢运行原始SQL查询。但是,如果一个复杂的查询调用find_by_sql,那么我将使用它而不会失去任何睡眠


如果你需要支持多个数据库,那么你可能想把它放进纯Rails方法中,但是这个要求很少见。

如果你有几个这样的查询,你可能想考虑使用。否则,我同意jdl。

事实上,我不喜欢这些答案,所以我做了一点挖掘,幸运地

我更喜欢这个

Place.find(:all, 
        :joins => "INNER JOIN scannables ON scannables.place_id = places.id",
        :conditions => [ "places.location_id = ? and scannables.bookdate BETWEEN ? and ?", 2474, '2009-08-29', '2009-09-02' ],
        :group => 'scannables.place_id',
        :having => 'SUM(scannables.available) >= 4')
它更简单,我仍然可以使用所有漂亮的rails机器来获得我不需要的部件。。少两个接头

虽然。。。我想知道有没有办法把它简化一些?可扫描对象和位置之间的关系已定义。。。我有很多,属于。。。那么为什么我仍然需要在上指定内部联接呢?不应该

:joins => :scannable work?
无论如何。。它不喜欢那样…

使用

:joins => :scannables

如果你已经建立了一个“有很多”的地方:可扫描者协会,那么这个方法应该有效(注意复数形式)。#find的:joins选项接受字符串和命名关联。

Hear,Hear
find_by_sql
的存在是有原因的。我只关心rails的纯度,因为它更好地服务于我的应用程序!这就是为什么我认为这可能有点过分……连接和包含之间的最大区别是什么?:包含用于指定应该立即加载的关联连接允许您指定连接发生的方式。实际上:having没有正确的效果。。。至少与上面原始sql的效果不同。。。我还使用了一个:order=>“sum(scannables.availables)”,它也不能正常工作-(