Ruby on rails 复杂范围,Rails 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 = ?",

因此,我正在构建一个与用户匹配的应用程序。用户模型有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 = ?", 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==“女性”)
结束
结束

我喜欢这样。我会重命名范围
查找男性
查找女性
,只是为了可读性(与布尔值冲突);但这并不是真的需要。