2014-12-09 64 views
1

我有以下情況:如何獲得ActiveRecord計數使用選擇

我有一個選擇查詢,我必須在選擇內計算一個值。當我再調用any?count它導致的ActiveRecord :: StatementInvalid厚望:

ActiveRecord::StatementInvalid: SQLite3::SQLException: near "*": syntax error: SELECT COUNT(foos.*, (foos.bar+1) as calculated) FROM "foos

我設置這種在一個小的測試,看起來像這樣:

require 'test_helper' 

class FooTest < ActiveSupport::TestCase 
    test 'any on active record relation' do 
    foos = Foo.select('foos.*, (foos.bar+1) as calculated') 
    assert(foos.any?, 'expected to work') 
    end 
end 

這似乎成爲rails的問題:https://github.com/rails/rails/issues/15138 所以我的第一個想法是使用all加載結果,但不影響任何內容。

Btw。我正在使用Rails 4.1

任何想法如何解決此問題?

編輯:

爲什麼我想這樣做的原因是folllowing:

我有一個包含經度/緯度位置的模型。當我查詢模型時,我計算到給定位置的距離並按距離排序記錄。所以我的查詢看起來像這樣:

nearest_records = MyModel 
     .select("mymodels.*, 
      ST_Distance(mymodels.lnglat, #{user_location}) as distance") 
     .order(distance).limit(6) 

這很好用。但現在我認爲我想知道我的列表是否包含任何記錄,所以我打電話給any?。這就像所描述的那樣破壞了洞洞。它造成的上述錯誤爲any?使用count。

所以,我第一次嘗試只是通過使用all方法執行查詢,但不縫合工作。我當前的解決方法是通過調用ActiveRecordRelation上的each觸發查詢,然後在第一個元素處中斷。

nearest_records.each { break } 

但我真的不喜歡這種soloution。希望有人能幫助我。

我用Rails 4.1.0

+1

我有計數問題。對我來說呢?似乎工作。您使用哪個版本的導軌?我正在使用4.1.8。 – Saravanan 2014-12-09 15:30:23

+0

@Saravanan感謝你的提示。我更新了導軌到版本4.1.8,現在它工作。看來他們已經修好了嗎?問題。當你使用count時,只需提供一個參數來計算,例如:所有'Foo.select('foos。*,(foos.bar + 1)as calculated')。count(:all)'工作。 – 2014-12-11 20:49:47

回答

0

這是一個不同的問題已鏈接的人,我不會真的認爲這是使用Rails的一個問題,因爲它是不清楚你想要達到的目的。

any?方法執行匹配某些條件的記錄計數,並在計數非零時返回true。結合這個查詢和上面的select是沒有意義的,沒有提供任何條件。

提供參數選擇僅適用於希望從表中檢索列的子集(或者可能來自其他表的列)的參數。當你想要記錄多個記錄時,你只需要選擇COUNT(id)或類似的,但Rails會自動執行此操作。

如果你可以更多地解釋你的代碼應該做什麼,這可能會有所幫助。

0

當您使用any? Rails在COUNT中包裝sql select語句。 使用selectany?會導致錯誤的SQL語句,因爲您不能在COUNT內使用多個列。

此外,計數幾列僅對聚合函數或DISTINCT有意義。 例如,

# count all records and count distinct 'bar' 
Foo.select('count(*), count(distinct(bar))') 
# count all records and sum 'bar' 
Foo.select('count(*), sum(bar)')