查找属于另一个的记录

时间:2014-04-12 17:54:19

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

“用户”has_many“食物”,但只有一种食物被标记为“最喜欢的”。给定用户,如果没有喜欢的食物,我怎样才能找到他们喜欢的食物或nil

用户表

id, email:string

食物表

id, user_id:integer, name:string, is_favorite:boolean

可能的解决方案:

  1. 我可以Foods.where()填写用户和is_favorite字段的条件。但这似乎不是最好的主动记录方式。见#2。

  2. 我可以尝试通过遍历对象来找到它,这对我来说似乎是更好的代码:@favorite_food = current_user.foods.???但我不确定如何找到最喜欢的。

  3. 重要的是,如果没有列出任何食物,您的答案会返回假名值,而不是错误。

4 个答案:

答案 0 :(得分:1)

尝试使用以下代码

@favorite_food = current_user.foods.where(is_favorite: true).first

答案 1 :(得分:0)

就这样做

current_user.foods.where(is_favorite: true)

顺便说一句,你可以看一下

生成的sql
p 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