Комплекс Сфера, Рельсы 3 - PullRequest
5 голосов
/ 28 августа 2011

Итак, я создаю приложение, соответствующее пользователям. Пользовательские модели имеют 3 атрибута (которые относятся к моему вопросу в любом случае: gender:string, looking_for_men:boolean, looking_for_women: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

Ответы [ 2 ]

6 голосов
/ 28 августа 2011

Я бы просто сделал приведенный ниже код, чтобы сделать его более читабельным. Но почему-то я не совсем доволен этим решением. Еще много кода:

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
2 голосов
/ 28 августа 2011

Просто с точки зрения области видимости, вы можете довольно легко переместить эту логику в область видимости, просто передав ее в прок.: http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html.

Я не уверен, что это вполне отвечает на ваш вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...