2011-05-25 54 views
2

我必須參數:姓名和年齡優雅紅寶石功能,需要幫助清理這件事,所以它看起來像紅寶石

def self.search(name, age) 

end 

如果名稱不爲空/零,然後將其添加到搜索表達式。

如果age不爲空/ nil,則將其添加到搜索表達式中。

如果兩者均爲零,則返回全部。

到目前爲止,我有:

def self.search(name, age) 

    if name.nil? && age.nil? 
     return User.all 
    end 



end 

發現很難在一個優雅的方式寫這篇文章。

回答

5
def self.search(name, age) 
    conditions = {} 
    conditions[:name] = name if name 
    conditions[:age] = age if age 
    User.find(:all, :conditions => conditions) 
end 
+0

我怎麼能支持,或者如果我需要,如姓名=「自衛隊」或年齡= 234 – Blankman 2011-05-25 17:00:26

1

我不知道你在做什麼樣的搜索,但我更喜歡來處理這些樣的東西在一個範圍之內。

class User < ActiveRecord::Base 
    scope :by_name, lamba{|name| name.nil?? scoped : where(:name=>name) } 
    scope :by_age, lamba{|age| age.nil?? scoped : where(:age=>age) } 

    def self.search(name, age) 
    User.by_name(name).by_age(age) 
    end 
end 

這是一個更多的代碼總體上我想,但它更可重用,一切都在它的地方。

+0

我喜歡過的作用域,但沒有「用戶.by_name(name).by_age(age)「做一個AND ?,例如一組然後一個子集(= AND) – 2011-06-27 13:37:12

1

在Rails 3,你可以做這樣的:

def self.search(name, age) 
    scope = User 
    scope.where(:name => name) if name.present? 
    scope.where(:age => age) if age.present? 
    scope 
end 

的使用注意事項的禮物呢?而不是零?跳過空字符串以及零。

在其他評論中,您提到想要或這些條件。 ActiveRecord不提供便利的設施;所有條件默認爲AND。您需要構建自己的條件,像這樣:

def self.search(name, age) 
    scope = User 
    if name.present? && age.present? 
    scope.where('name = ? OR age = ?', name, age) 
    else 
    scope.where(:name => name) if name.present? 
    scope.where(:age => age) if age.present? 
    end 
    scope 
end