我的应用程序使用Users
,Stories
,Competitions
和Submissions
为写作比赛建模。
用户可以通过提交或作为所有者参加比赛。我想要一个返回用户拥有或参与的所有比赛的查询或方法。我有一个方法将这些作为数组返回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
答案 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)
我们使用左连接(而不是默认的内连接),这样我们仍然可以返回用户拥有但尚未提交的竞赛。