Ruby on rails 复杂范围,Rails 3
因此,我正在构建一个与用户匹配的应用程序。用户模型有3个属性(与我的问题相关:Ruby on rails 复杂范围,Rails 3,ruby-on-rails,ruby-on-rails-3,activerecord,scope,Ruby On Rails,Ruby On Rails 3,Activerecord,Scope,因此,我正在构建一个与用户匹配的应用程序。用户模型有3个属性(与我的问题相关:gender:string,查找男性:boolean,查找女性:boolean) 目前,我的模型中有这样一种方法: def browse if self.looking_for_men == true && self.looking_for_women == true if self.sex == "Male" User.where("looking_for_men = ?",
gender:string
,查找男性:boolean
,查找女性:boolean
)
目前,我的模型中有这样一种方法:
def browse
if self.looking_for_men == true && self.looking_for_women == true
if self.sex == "Male"
User.where("looking_for_men = ?", true)
elsif self.sex == "Female"
User.where("looking_for_women = ?", true)
end
elsif self.sex == "Male" && self.looking_for_men == true
User.where("looking_for_men = ? AND sex = ?", true, "Male")
elsif self.sex == "Female" && self.looking_for_women == true
User.where("looking_for_women = ? AND sex = ?", true, "Female")
else
if self.sex == "Male"
User.where("looking_for_men = ? AND sex = ?", true, "Female")
elsif self.sex == "Female"
User.where("looking_for_women = ? AND sex = ?", true, "Male")
end
end
end
正如你所知,这是相当混乱的。是否有任何方法来清理这一点,并将其纳入范围,例如,我是一个男性用户,我正在寻找女性,当我进行这样的查询时,它只返回正在寻找男性的女性:
@users = User.all.browse
从作用域的角度来看,您可以通过将逻辑传递给proc,相当轻松地将其移动到作用域中
class User
scope :browse_for, lambda { |user|
user.looking_for_men == true && user.looking_for_women == true
...
}
end
@users = User.browse_for(@single_male)
您还可以将作用域链接在一起以清理逻辑:
我不确定这是否完全回答了您的问题?我只想执行下面的代码,以使其更具可读性。但不知何故,我对这个解决方案并不完全满意。仍然有很多代码:
class User < ActiveRecord::Base
scope :male, where(:gender => "Male")
scope :female, where(:gender => "Female")
scope :looking_for_men, where(:looking_for_men => true)
scope :looking_for_women, where(:looking_for_women => true)
def browse
@women = @men = []
@women = self.interested_females if self.looking_for_women
@men = self.interested_males if self.looking_for_men
@result = @women.concat(@men)
@result.delete(self) #removes the user itself from the result-set
return @result
end
def interested_females
return User.female.looking_for_men if self.male?
return User.female.looking_for_women if self.female?
end
def interested_males
return User.male.looking_for_men if self.male?
return User.male.looking_for_women if self.female?
end
def male?
return (self.gender == "Male")
end
def female?
return (self.gender == "Female")
end
end
class用户“男性”)
范围:女性,其中(:性别=>“女性”)
范围:查找男人,其中(:查找男人=>true)
范围:寻找女性,其中(:寻找女性=>true)
def浏览
@女人=@男人=[]
@女性=自私自利的女性,如果自私自利的女性
@男人=自私自利的男人如果自私自利的男人
@结果=@women.concat(@men)
@result.delete(self)#从结果集中删除用户本身
返回@result
结束
女性
如果self.male,返回User.femal.looking\u查找\u men?
如果self.femal,返回User.femal.looking_查找_women?
结束
def感兴趣的男性
如果self.male,返回User.male.looking_查找_men?
如果self.femal,返回User.male.looking_寻找_women?
结束
男性?
回报(自我性别=“男性”)
结束
女性?
返回(self.gender==“女性”)
结束
结束
我喜欢这样。我会重命名范围查找男性
和查找女性
,只是为了可读性(与布尔值冲突);但这并不是真的需要。