belongs_to :keeper, :class_name => "Staff"
belongs_to "staff", :foreign_key => "keeper_id"
在我的基本测试中,这些似乎完全相同。
它们确实一样吗?
一个比另一个好吗?
答案 0 :(得分:5)
这两个语句定义了相同的关联。不同之处在于定义关联的类如何引用已定义的关联。
调用belongs_to定义了调用类处理给定关系的新实例方法的整个过程。这些新方法基于belongs_to的第一个参数命名。与大多数其他Rails一样,ActiveRecord将使用从第一个参数派生的合理默认值来生成管理关联的方法。为belongs_to提供额外的参数只是覆盖那些默认值。
实际上,它们除了名称之外都是相同的。这一切都取决于您的个人喜好。您是希望引用与@model.keeper
或@model.staff
的关联吗?
阅读belongs_to section of the Associations引用,以便更好地了解模型属于另一个模型时提供的方法以及如何使用belongs_to的选项。
答案 1 :(得分:1)
这些陈述在他们使用它们的类的方法方面没有什么不同。让我们假设你在类Office中定义这些语句,所以第一个语句,即
class Office < ActiveRecord::Base
belongs_to :keeper, :class_name => "Staff"
end
正在创建Staff和Office类之间的关系,但从Office到Staff的关系称为keeper,并将使用keeper_id作为Office类中的外键来建立关系。因此,如果Office变量中有Office对象的实例,则可以使用
获取该office对象的Staffoffice.keeper
在另一种情况下,
class Office < ActiveRecord::Base
belongs_to :staff, :foreign_key => "keeper_id"
end
您正在创建Staff和Office类之间的关系,并且从Office到Staff的关系称为staff,并且将使用keeper_id作为Office类中的外键,以便在指定外键时建立关系。
所以在这种情况下,如果你想找到工作人员,那么你会做
office.staff
总之,如果你这样做
belongs_to :staff
在您的模型中,然后根据rails约定,您将在模型中获得一个staff方法,该方法将使用staff_id作为外键来建立Staff模型与此模型之间的关系。但rails还为您提供了在特殊情况下覆盖这些约定的选项,例如遗留应用程序。所以基本上你通过使用外键和类名来覆盖上述两个语句中的rails约定。
答案 2 :(得分:1)
两个代码都做类似的事情,但是有区别。如果是第一行,则rails会猜到Staff
的引用是由keeper_id
完成的,它只会添加_id
。在第二种情况下,您可以通过提供:foreign_key
属性来告诉它应该在哪里搜索引用。
区别可能在于您如何引用您想要归属的课程。在第一种情况下,它将是XY.keeper
,在第二种情况下它应该是XY.staff
。取决于你喜欢哪种形式。
答案 3 :(得分:1)
尽管两种方法在定义关系方面都是等价的,但主要区别在于名称,两者中的“更好”是您目前使用最多的方法。这比一致性更重要。
你想把事情称为:
object.keeper
或使用它更明智:
object.staff
我个人的偏好是第一种形式,但一般来说要清楚我表达了关系的所有怪癖,如果它在任何方面都不寻常。定义如下:
belongs_to :keeper,
:class_name => 'Staff',
:foreign_key => :keeper_id
通过全面阐明关系的性质,可以减少可能出现的混乱。