2011-06-09 67 views
4

我可以返回一個對象集合,只有一個(:limit => 1),但有沒有辦法只返回.first()對象,就像不在集合中一樣?named_scope和.first?

named_scope :profile, :conditions => {:association => 'owner', :resource_type => 'Profile'}, :limit => 1 # => collection of 1 profile but I want the profile only NOT in a collection or array 

的解決方法很簡單,就是運用。首先()的結果,但我只是想清理代碼,使其不容易出錯。

+0

我不得不說,投票是一致的,它是一種方法,工作得很好,第一次看到where(),非常方便。謝謝大家。 – 2011-06-09 21:22:31

回答

7

你可能需要創建一個類的方法來代替:

def self.profile 
    where(:association => 'owner', :resource_type => 'Profile').first 
end 

注意,使用Rails 3,你應該使用where(...)語法,以及這樣做.first時,你不需要指定限制。

3

定義一個類的方法來做到這一點:

def profile 
    where(:association => "owner", :resource_type => 'Profile').first 
end 

first已經做的查詢隱式limit 1,並將該表的主鍵順序,所以你永遠得到的第一個。

+4

'self.profile',而不是'profile' :) – 2011-06-09 20:56:51

5

首先,如果您使用的是Rails 3,則應該使用scope而不是named_scope。同樣的事情,不同的錯誤,名稱(named_scope仍然可以使用,但不推薦使用)。現在,這是...

範圍(或命名範圍)接受兩個參數(一個符號和一個lambda或一個哈希),並定義在該模型上返回一個ActiveRecord :: Relation的類方法,這就是爲什麼你能夠鏈接它的方法。

first,如findall,從數據庫返回實際結果。出於這個原因,它不能在範圍內工作。所有這一切說,你可以在你的模型上定義你自己的類方法,以提供你想要的行爲(因爲2人已經在我輸入這個時候已經回答了)。實際上,Rails社區的許多備受推崇的開發人員推薦使用這個範圍。由於使用scope類宏只是自己定義類方法本身,所以不存在真正的缺點,它具有靈活性的好處(就像你的情況一樣)。

+0

大聲笑,我很蹩腳,我看到了棄用警告,但從來沒有意識到(或讀過它們!),他們與我新添加的named_scopes有關,感謝讓我看到燈光,變成範圍。 – 2011-06-09 21:26:50