如何使用ActiveRecord将一个表中的两列指向另一个表中的同一列?

时间:2009-12-10 06:28:19

标签: ruby-on-rails ruby activerecord associations multiple-tables

我冒着手掌到额头的风险,但我无法弄清楚如何使用Rails的ActiveRecord糖来做到这一点。

我有一个tickets表,其中有两列(submitter_idassignee_id),每个列都应该引用users表中的不同用户(特别是{{1} } id表中的列。我希望能够使用ActiveRecord的关联来执行usersticket.submitter.name之类的操作。提交者和受让人只是不同关联名称下的用户对象。

我发现的唯一与我正在做的事情接近的是使用多态关联,但最后我很确定它并不是我真正需要的。我不会有多种类型,提交者和受让人都是用户,很可能是两个不同的用户。

任何帮助都会很棒。谢谢!

2 个答案:

答案 0 :(得分:15)

class Ticket < ActiveRecord::Base
  belongs_to :submitter, :class_name => "User"
  belongs_to :assignee, :class_name => "User"
end

应该工作。

编辑:没有尝试,我不确定你是否需要:foreign_key参数。我的直觉不是,但它不会受到伤害。

再次编辑:抱歉,离开了用户 - &gt;票务协会。你没有提到使用它们,如果我不打算在另一个方向上使用它们,我通常只会在一个方向上添加关联。

无论如何,试试:

class User < ActiveRecord::Base
  has_many :assigned_tickets, :class_name => "Ticket", :foreign_key => "assignee_id"
  has_many :submitted_tickets, :class_name => "Ticket", :foreign_key => "submitter_id"
end

答案 1 :(得分:6)

这样的事情应该有效

class Ticket < ActiveRecord::Base
  belongs_to :submitter, :class_name => 'User', :foreign_key => 'submitter_id'
  belongs_to :assignee,  :class_name => 'User', :foreign_key => 'assignee_id'
end

class User < ActiveRecord::Base
  has_many :tickets, :class_name => 'Ticket', :foreign_key => 'submitter_id'
  has_many :tickets_assigned,  :class_name => 'Ticket', :foreign_key => 'assignee_id'
end

是的,PreciousBodilyFluids是对的,我们不需要在Ticket类中指定foreign_key,因为rails可以从列名中推断出它,即submitter_id和assignee_id

但是如果您的关联名称与column_name_ {id}不同,那么您必须指定它,即User类案例