2013-06-25 43 views
0

我有一個奇怪的問題......在模型用戶,具有與模型沒有利益關係,我嘗試調用此查詢:ActiveRecord的。凡()方法

# file model.rb 
def self.my_func 
    Interest.where('id IN (?)', [1,2]) 
end 

但它的完全忽略...如果我用這個替換:

# file model.rb 
def self.my_func 
    Interest.find(1) 
end 

.find()方法被觸發,我得到結果。

如果我直接調用rails console它的工作原理Interest.where('id IN (?)', [1,2]) ...... 我對RoR的3.2.13

任何想法? 謝謝大家。

+0

你迭代或調用'#'對my_func' to_a'? – nowk

+0

my_func返回什麼?我不明白「完全無視」。 – Fred

+0

你用功能的結果做了什麼? –

回答

3

Rails不會評估查詢,直到您實際嘗試訪問結果。調用Model.where只是返回一個ActiveRecord::Relation,您可以在其中鏈接額外的where/order/etc調用。

試試這個(.all強制進行評估查詢,並返回結果的數組):

def self.my_func 
    Interest.where(id: [1,2]).all 
end 

注意,應不應該真正做到這一點。對於您的模型來說,只允許從方法返回ActiveRecord::Relation會更好,因此調用代碼可以對其應用額外的範圍/排序方法。

還要注意的是,如果您只是使用where(id: [1,2]),而不是手動構建id in (?)查詢,Rails就足夠智能爲您執行了。


獎勵說明:

在終端上,結果得到來自Model.where立即使用,因爲IRB每個表達式的結果調用inspect評估你輸入所以它有一些打印,並返回ActiveRecord::Relation評估其查詢時查詢。您可以通過添加;nil來繞過此以證明您自己的觀點,以便您的語句評估爲nil;注意,SELECT不會發生,直到我手動調用x.inspect

irb(main):008:0> x = User.where("name like 'bob'"); nil 
=> nil 
irb(main):009:0> x.inspect 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE (name like 'bob') 
=> "[]" 
+0

是的!你爲我節省了很多時間!我不知道查詢在我嘗試訪問結果之前不會執行。謝謝你太多了! – Gozup