2011-01-09 85 views
1

我花了一些時間搞清楚這一點,並沒有看到其他人張貼在上面,所以也許這將有助於某人。另外,我沒有太多的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 

回答

1

你可能也只是使用 User.find_or_create_by_first_name_and_last_name(:first_name => "firstname", :last_name => "last_name")