“用户”has_many“食物”,但只有一种食物被标记为“最喜欢的”。给定用户,如果没有喜欢的食物,我怎样才能找到他们喜欢的食物或nil
?
用户表
id, email:string
食物表
id, user_id:integer, name:string, is_favorite:boolean
可能的解决方案:
我可以Foods.where()
填写用户和is_favorite
字段的条件。但这似乎不是最好的主动记录方式。见#2。
我可以尝试通过遍历对象来找到它,这对我来说似乎是更好的代码:@favorite_food = current_user.foods.???
但我不确定如何找到最喜欢的。
重要的是,如果没有列出任何食物,您的答案会返回假名值,而不是错误。
答案 0 :(得分:1)
尝试使用以下代码
@favorite_food = current_user.foods.where(is_favorite: true).first
答案 1 :(得分:0)
就这样做
current_user.foods.where(is_favorite: true)
顺便说一句,你可以看一下
生成的sqlp current_user.foods.where(is_favorite: true).to_sql
答案 2 :(得分:0)
Food
模型
class Food < ActiveRecord::Base
scope :favorite, -> { where(is_favorite: true) }
end
并在控制器中使用它
@favorite_food = current_user.foods.favorite # Which gives you the array of favorite foods for the user.
如果没有喜欢的食物(即is_favorite=>false
),那么@favorite_food
将为nil
答案 3 :(得分:0)
为了使其更整洁,您需要查看ActiveRecord Association Extensions(因此您在User
模型中定义了方法,而不是Food
模型):
#app/models/user.rb
Class User < ActiveRecord::Base
has_many :foods do
def favorite
where(is_favorite: true)
end
end
end
#-> current_user.foods.favorite
或者你可以使用实例方法只调用一个方法:
#app/models/user.rb
class User < ActiveRecord::Base
def favorite_foods
joins(:foods).where(is_favorite: true)
end
end
#-> current_user.favorite_foods