2010-02-09 193 views

回答

5

这两个语句定义了相同的关联。区别在于定义的关联是如何由定义这些关联的类引用的。

调用belongs_to为调用类定义了全新的实例方法来处理给定的关系。这些新方法是根据belongs_to的第一个参数命名的。与大多数Rails其余部分一样,ActiveRecord将使用从第一个参数派生的合理默认值来生成管理关联的方法。为belongs_to提供附加参数,仅覆盖这些默认值。

实际上,它们的名字完全相同。这一切都归结于您的个人偏好。您是否愿意提及@model.keeper@model.staff的关联?

请仔细阅读belongs_to section of the Associations参考,以更好地了解模型属于另一个模型时所提供的方法以及如何使用belongs_to的选项。

+0

看起来每个人都同意这里;)谢谢。 – 99miles 2010-02-09 22:44:34

1

没有这些语句在他们要给你使用它们的类的方法上稍有不同。让我们假设你定义的类办公室内这些语句,因此第一条语句,即

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约定。

1

这两个代码做类似的事情,但有区别。在第一行的情况下,导轨猜测Staff的引用是由keeper_id完成的,它只是增加了一个_id。在第二种情况下,您通过给出:foreign_key属性来告诉它应该在哪里搜索参考。

区别可能在于你如何引用你想要属于的类。在第一种情况下,它将是XY.keeper,在第二种情况下它应该是XY.staff。取决于你喜欢哪种形式。

1

虽然这两种方法在定义关系方面是等价的,但主要区别在于名称,两者中的“更好”是您当前使用最多的。这是一个比任何事情都重要的问题。

你想指事情:

object.keeper 

抑或是更明智的使用:

object.staff 

我个人的偏好是第一种形式,但一般要清楚我如果在任何方面都不寻常,就表达所有关系的怪癖。其定义如下:

belongs_to :keeper, 
    :class_name => 'Staff', 
    :foreign_key => :keeper_id 

通过详细说明关系的性质,可能出现的混淆程度被最小化。

相关问题