belongs_to :keeper, :class_name => "Staff"
belongs_to "staff", :foreign_key => "keeper_id"
在我的基本测试中,这些似乎是做了完全相同的事情。
它们确实是一样的吗?
一个比另一个更好吗?这两个'belongs_to'语句之间有任何区别
belongs_to :keeper, :class_name => "Staff"
belongs_to "staff", :foreign_key => "keeper_id"
在我的基本测试中,这些似乎是做了完全相同的事情。
它们确实是一样的吗?
一个比另一个更好吗?这两个'belongs_to'语句之间有任何区别
这两个语句定义了相同的关联。区别在于定义的关联是如何由定义这些关联的类引用的。
调用belongs_to为调用类定义了全新的实例方法来处理给定的关系。这些新方法是根据belongs_to的第一个参数命名的。与大多数Rails其余部分一样,ActiveRecord将使用从第一个参数派生的合理默认值来生成管理关联的方法。为belongs_to提供附加参数,仅覆盖这些默认值。
实际上,它们的名字完全相同。这一切都归结于您的个人偏好。您是否愿意提及@model.keeper
或@model.staff
的关联?
请仔细阅读belongs_to section of the Associations参考,以更好地了解模型属于另一个模型时所提供的方法以及如何使用belongs_to的选项。
没有这些语句在他们要给你使用它们的类的方法上稍有不同。让我们假设你定义的类办公室内这些语句,因此第一条语句,即
class Office < ActiveRecord::Base
belongs_to :keeper, :class_name => "Staff"
end
创造员工和Office类,但由办公室工作人员的关系之间的关系被称为门将,将使用keeper_id作为在Office类的外键建立关系。所以,如果你在办公室可变Office对象的实例,那么你就可以得到工作人员使用
office.keeper
在其他场景,办公对象,
class Office < ActiveRecord::Base
belongs_to :staff, :foreign_key => "keeper_id"
end
要创建员工之间的关系Office类以及Office与Staff之间的关系称为staff,并且将在Office类中使用keeper_id作为外键,以便按照您指定的外键来建立关系。
所以,如果你想获得对工作人员这种情况下,那么你会做
office.staff
总之,如果你只是做
belongs_to :staff
在你的模型,然后根据Rails约定,你将在你的模型中得到一个员工方法,它将使用staff_id作为外键来建立员工模型和这个模型之间的关系。但是,在特殊情况下,Rails还可以选择覆盖这些约定,例如传统应用程序。所以基本上你使用外键和类名覆盖上面两个语句中的rails约定。
这两个代码做类似的事情,但有区别。在第一行的情况下,导轨猜测Staff
的引用是由keeper_id
完成的,它只是增加了一个_id
。在第二种情况下,您通过给出:foreign_key
属性来告诉它应该在哪里搜索参考。
区别可能在于你如何引用你想要属于的类。在第一种情况下,它将是XY.keeper
,在第二种情况下它应该是XY.staff
。取决于你喜欢哪种形式。
虽然这两种方法在定义关系方面是等价的,但主要区别在于名称,两者中的“更好”是您当前使用最多的。这是一个比任何事情都重要的问题。
你想指事情:
object.keeper
抑或是更明智的使用:
object.staff
我个人的偏好是第一种形式,但一般要清楚我如果在任何方面都不寻常,就表达所有关系的怪癖。其定义如下:
belongs_to :keeper,
:class_name => 'Staff',
:foreign_key => :keeper_id
通过详细说明关系的性质,可能出现的混淆程度被最小化。
看起来每个人都同意这里;)谢谢。 – 99miles 2010-02-09 22:44:34