7

我在这里冒着手掌到额头的风险,但我无法完全弄清楚如何用Rails的ActiveRecord糖做到这一点。如何让一个表中的两列与ActiveRecord中的另一列指向另一列中的同一列?

我有一个具有两列(submitter_idassignee_id)应每个参考从users表(特别是在usersid列)不同的用户一个tickets表。我希望能够使用ActiveRecord的关联功能执行诸如ticket.submitter.nameticket.assignee.email之类的操作。提交者和受让人只是不同关联名称下的用户对象。

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

任何帮助将是太棒了。谢谢!

回答

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

建议立即进行删除工作。

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

再次编辑:对不起,离开了用户 - >票务协会。您没有提及使用它们,如果我不打算在另一个方向使用它们,我通常只会在一个方向上添加关联。

无论如何,尝试:

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 
+0

绝对是一个手掌到额头的时刻。我知道它在那里,但我不能访问那一点的内存。感谢您在这里帮助我! – localshred

+0

这个答案节省了我们很多时间,_谢谢你。 – potashin

5

像这样的东西应该工作

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是正确的,我们并不需要在票务类指定foreign_key铁轨从列名,即submitter_id推断它和assignee_id

但是如果你的公会的名字是从column_name_ {ID}不同的,那么你将有指定,即User类案件

+0

外键是在belongs_to的声明不必要的,如果它可以从关联的名称派生。 – EmFi

+0

你是对的,这就是为什么我在我的回复中提到它:) – nas

相关问题