【发布时间】:2016-05-07 05:57:03
【问题描述】:
我有几个模型...
class Game < ActiveRecord::Base
belongs_to :manager, class_name: 'User'
has_many :votes
end
class Vote < ActiveRecord::Base
belongs_to :game
belongs_to :voter, class_name: 'User'
end
class User < ActiveRecord::Base
has_many :games, dependent: :destroy
has_many :votes, dependent: :destroy
end
在我的控制器中,我有以下代码...
user = User.find(params[:userId])
games = Game.includes(:manager, :votes)
我想在游戏中添加一个属性/方法voted_on_by_user,它采用 user_id 参数并返回 true/false。总的来说,我对 Rails 和 Ruby 还比较陌生,所以我还没有想出一个干净的方法来完成这个。理想情况下,我想避免 N+1 queries problem 在我的游戏模型上添加类似的东西......
def voted_on_by_user(user)
votes.where(voter: user).exists?
end
但我对 Ruby/Rails 不够了解,无法找到一种仅通过一次数据库往返即可完成此任务的方法。有什么建议吗?
我尝试/研究过的一些事情
-
Specifying conditions on Eager Loaded Associations
- 我不知道如何指定这个或给包含一个不同的名称,如
voted_on_by_user。这并没有给我想要的东西......
Game.includes(:manager, :votes).includes(:votes).where(votes: {voter: user}) - 我不知道如何指定这个或给包含一个不同的名称,如
-
Getting clever with joins。所以也许像......
Game.includes(:manager, :votes).joins("as voted_on_by_user LEFT OUTER JOIN votes ON votes.voter_id = #{userId}")
【问题讨论】:
标签: ruby-on-rails activerecord