在Rails中查询多个关联的正确方法是什么?

时间:2012-10-16 18:10:36

标签: ruby-on-rails-3 activerecord associations

我的应用程序使用UsersStoriesCompetitionsSubmissions为写作比赛建模。

用户可以通过提交或作为所有者参加比赛。我想要一个返回用户拥有或参与的所有比赛的查询或方法。我有一个方法将这些作为数组返回competitions | owned_competitions,但我真的想保留它们ActiveRecord实体,这样我就可以链接,应用范围等。

有没有办法做到这一点,或者更好的方式来设置这些关系?

我的模特看起来像这样:

user.rb:

has_many :stories
has_many :submissions
has_many :competitions, :through => :submissions
has_many :owned_competitions, :class_name => "Competition"

story.rb:

belongs_to :user
has_many :submissions
has_many :competitions, :through => :submissions

competition.rb:

belongs_to :owner, :class_name => "User", :foreign_key => 'user_id'
has_many :submissions
has_many :competitors, :through => :submissions, :source => :user
has_many :stories, :through => :submissions

scope :expiring_today, lambda { where("deadline = ?", Date.today) }

submission.rb:

belongs_to :user
belongs_to :story
belongs_to :competition

1 个答案:

答案 0 :(得分:1)

你想要的是绝对可能的。实际上,甚至可能没有编写任何SQL,但我不确切知道如何。

以下是我的想法:

Competition.joins('left join submissions on submissions.competition_id = competitions.id').where('competitions.user_id = :uid OR submissions.user_id = :uid', :uid => user)

我们使用左连接(而不是默认的内连接),这样我们仍然可以返回用户拥有但尚未提交的竞赛。