2012-03-16 35 views
3

我很喜歡學習,但我無法弄清楚這一點。我目前的所有查詢都是類似MyObject.find(various conditions)。這將返回一個數組MyObject s,並且對於大多數目的而言是足夠的。但是現在我想創建一個最受歡迎的項目列表,其中查詢如select name, count(*) from MyObjects group by name order by 2。這不會返回MyObject,這將返回任意數據列。那我該怎麼做?如何在Ruby on Rails中編寫任意SQL查詢?

+0

。你能更清楚一點嗎? – Calvin 2012-03-16 05:15:15

回答

0

您隨時可以:

MyObject.find_by_sql('query....') 

,但通常有更好的方法。

5

如果您使用MyObject.find_by_sql應該可以解決您的問題。您可以像往常一樣通過返回的對象訪問在select語句中使用的任何其他列。例如,

MyModelName.find_by_sql("select coulmn1, column2 as somenewname, 
    column3 as someothername from....") 

這將返回對象,每個對象都具有稱爲somenewname和someothername的屬性。

有關find_by_sql方法的更多信息,請參閱文檔。

+0

謝謝,這正是我以爲我在尋找的東西,但find_by_sql似乎應該適合我的目的。 – Kundan 2012-03-16 05:20:15

2

你可以做一些簡單的像,通過標準的ActiveRecord查詢接口:

results = MyObject.select('name, count(*) as how_many') 
        .group(:name) 
        .order(:how_many) 

# And later... 
results.each do |o| 
    puts "#{o.name} has #{o.how_many}" 
end 

,所以你不必訴諸SQL。

正如其他人所提到的,如果您想使用SQL查詢基於SQL查詢來實例化一組模型對象,也有find_by_sql

如果您有一些SQL查詢從多個表中收集數據或包含AR不擅長的事情(子查詢,派生表,...),那麼您可以將ActiveRecord推開,直接與數據庫:

connection.select_rows('some big pile of sql').each do |r| 
    # r will be an array of strings so you have to pull 
    # it apart and sort out the types by hand 
end 

使用select_rows如果你對數據進行編碼的一大堆直JSON(或類似)也可能是有用的,而且不需要對ActiveRecord的細微,不想支付處理使用ActiveRecord的開銷。

0

你可以嘗試這聽起來就像它是可行的與活動記錄ORM路

MyObject.select(:name, "count(*) as count").group(...).order(...)