这是我之前遇到的一个问题的更新问题。我正在为当地的狗收养创建一个'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
如果用户没有孩子,则可以显示对该问题同时回答真假的狗,因为可以与该用户一起放置AND并非儿童友好的狗。我意识到如果这是匹配的唯一标准,我可以简单地在上面的方法中添加else, Dog.all
语句。由于还有其他布尔字段要匹配(即user.has_cats和dog.cat_friendly),这个解决方案不起作用。我想我需要一个包含数组的变量,但不确定......任何建议。
答案 0 :(得分: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支持的任何其他内容)。
答案 1 :(得分: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
我可以预见这个解决方案会因为添加更多参数而变得有点麻烦。条件语句可能会很长。谢谢你的任何建议!
答案 2 :(得分:0)
def self.by_profile(user)
user.kids_under_10 ? Dog.where(kids_under_10: true) : Dog.all
end
不是很优雅,但应该有用。