0

这是我之前遇到的问题的更新问题。我正在为当地的狗收养创建一个“match.com”风格的应用程序,用户和狗都有个人资料。在每个配置文件中,都有布尔字段。我试图只向最终用户展示与他们的用户资料相匹配的狗。然而,简单的一对一匹配不起作用,因为逻辑会根据用户的布尔值而变化。例如,如果用户有孩子 (user.kids_under_10:true),那么我只需将其与可以与孩子放在一起的狗匹配 (dog.kids_under_10:true)。该模型看起来像

class Dog < ActiveRecord::Base

def self.by_profile(user)
  if user.kids_under_10 == true
    Dog.where(kids_under_10: user.kids_under_10)
  end
end

然而,如果用户没有孩子,则可以显示对这个问题回答正确和错误的狗,因为可以与该用户放置对孩子不友好的狗。我意识到如果这是唯一的匹配标准,我可以简单地else, Dog.all在上述方法中添加一条语句。但是,由于还有其他布尔字段要匹配(即 user.has_cats 和 dog.cat_friendly),因此该解决方案不起作用。我想我需要一个包含数组的变量,但不太确定......任何建议。

4

3 回答 3

1

尝试使用这样的东西:

class Dog < ActiveRecord::Base
  def self.by_profile(user)
    dogs = scoped

    dogs = dogs.where(kids_under_10: true) if user.kids_under_10
    dogs = dogs.where(cat_friendly: true) if user.own_cats
    # other conditions

    dogs
  end
end

基本上,该scoped方法为您提供了一个空关系。然后,您可以使用它有条件地添加where语句(或 AR 支持的任何其他内容)。

于 2012-12-22T22:21:56.593 回答
0
def self.by_profile(user)
  user.kids_under_10 ? Dog.where(kids_under_10: true) : Dog.all
end

不是很优雅,但应该可以工作。

于 2012-12-22T23:35:00.887 回答
0

所以我找到了一个解决方案,但我不确定它是否是最有效的解决方案,所以非常欢迎任何建议(我是编程新手,希望学习处理不同情况的“最佳”方法)。这是我解决问题的方法:

class Dog < ActiveRecord::Base

def self.by_profile(user)
  if user.kids_under_10?
    kids_under_10 = true
  else
    kids_under_10 = [true, false]
  end

  Dog.where(kids_under_10: kids_under_10)
end
end

随着我添加更多参数,我可以预见这个解决方案会变得有点麻烦。条件语句可能会变得很长。感谢您的任何建议!

于 2012-12-22T22:15:21.960 回答