如何解决优雅的红宝石功能,需要帮助清除它,使其看起来像红宝石
|| 我要输入参数:姓名和年龄def self.search(name,age)
end
如果名称不为空/无,则将其添加到搜索表达式中。
如果age不为空/零,则将其添加到搜索表达式中。
如果两者均为零,则全部返回。
到目前为止,我有:
def self.search(name,age)
if name.nil? && age.nil?
return User.all
end
end
很难以优雅的方式编写此代码。
解决方法
def self.search(name,age)
conditions = {}
conditions[:name] = name if name
conditions[:age] = age if age
User.find(:all,:conditions => conditions)
end
,我不确定您要进行哪种搜索,但是我更喜欢在范围内处理这些事情。
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
我想它总体上要多一点代码,但是它更可重用,并且一切都在它的位置。
,在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
注意使用礼物吗?而不是零?跳过空字符串以及nil。
在另一条评论中,您提到要对这些条件进行“或”运算。 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。