我花了一些時間搞清楚這一點,並沒有看到其他人張貼在上面,所以也許這將有助於某人。另外,我沒有太多的Rails的經驗,所以我會很感激任何更正或建議,但下面的代碼似乎運作良好。使用命名範圍與find_or_create_by
我已經設置了一個虛擬屬性,使name在first_name和last_name之外,如Railscast on virtual attributes所述。我想通過full_name進行搜索,所以我添加了Jim's answer here中建議的named_scope。
named_scope :find_by_full_name, lambda {|full_name|
{:conditions => {:first => full_name.split(' ').first,
:last => full_name.split(' ').last}}
}
但是...我想能夠使用所有這些:find_or_create_by_full_name。使用該名稱創建命名範圍僅提供搜索(它與上面的:find_by_full_name代碼相同) - 即它不會按照我的要求進行操作。因此,爲了處理這個我創建了一個類的方法,我稱之爲用戶等級:find_or_create_by_full_name
# This gives us find_or_create_by functionality for the full_name virtual attribute.
# I put this in my user.rb class.
def self.find_or_create_by_full_name(name)
if found = self.find_by_full_name(name).first # Because we're using named scope we get back an array
return found
else
created = self.find_by_full_name(name).create
return created
end
end