这两个'belongs_to'语句之间有什么区别吗?

时间:2010-02-09 21:58:26

标签: ruby-on-rails ruby

belongs_to :keeper, :class_name => "Staff"
belongs_to "staff", :foreign_key => "keeper_id"

在我的基本测试中,这些似乎完全相同。
它们确实一样吗?
一个比另一个好吗?

4 个答案:

答案 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对象的Staff
office.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

通过全面阐明关系的性质,可以减少可能出现的混乱。