2013-02-22 62 views
3

我剛剛開始在軌道上的紅寶石,並有一個更復雜的查詢一個問題。到目前爲止,我在查看導軌指南時做了簡單的查詢,並且它工作得非常好。從軌道上的ruby執行查詢正確的方式

現在我試圖從數據庫中獲取一些Ids,我會使用這些Ids來獲得真實的對象並對它們做些什麼。獲取這些比簡單的Object.find方法複雜一些。

這裏是我的查詢看起來像:

select * from quotas q, requests r 
where q.id=r.quota_id 
and q.status=3 
and r.text is not null 
and q.id in 
(
select A.id from (
select max(id) as id, name 
from quotas 
group by name) A 
) 
order by q.created_at desc 
limit 1000; 

執行從SQL管理該查詢時,這會給我1000個IDS。我想先獲得id列表,然後通過id查找對象。

有沒有辦法通過使用此查詢直接獲取這些對象?避免ID查找?我用Google搜索,你可以這樣執行查詢:

ActiveRecord::Base.connection.execute(query); 

回答

3

假設Quota has_many :requests

Quota.includes(:requests). 
    where(status:3). 
    where('requests.text is not null'). 
    where("quotas.id in (#{subquery_string_here})"). 
    order('quotas.created_at desc').limit(1000) 

我決不是一個專家,但最基本的SQL功能被烤成的ActiveRecord。您可能還想查看#group#pluck方法來消除醜陋的字符串子查詢。

在關係對象上調用#to_sql將向您顯示它相當於的SQL命令,並可能有助於您的調試。

+0

感謝您的回覆我得到這個錯誤'缺少表的「FROM-clause條目」quotas「'。我在哪裏錯過了,你能告訴嗎? – 2013-02-22 08:41:01

0

我會爲此使用find_by_sql。我不會發誓,這是完全正確的,但正如我記得你幾乎可以將一條SQL語句放到一個find_by_sql中,並且結果列將作爲你所調用類的一個對象數組的屬性返回:

status = 3 
    Quota.find_by_sql(' 
    select * 
    from quotas q, requests r 
    where q.id=r.quota_id 
    and q.status= ? 
    and r.text is not null 
    and q.id in 
    (
     select A.id from (
     select max(id) as id, name 
     from quotas 
     group by name) A 
    ) 
    order by q.created_at desc 
    limit 1000;', status) 

如果你來的Rails有人用來書寫原始SQL,你可能會更好過使用這種語法不是串在一起一堆ActiveRecord的方法 - 的結果是一樣的,所以它只是一個你事找到更多可讀性。

順便說一句,你不應該在SQL查詢中使用字符串插值(即#{variable}語法)。使用 '?'語法(請參閱我的示例)以避免SQL注入潛力。