2013-01-21 34 views
0

看着铁轨例如这种结构的模型:两种模型如何访问对方?

enter image description here

,并在代码中,我们有:

class LineItem < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :cart 
    attr_accessible :cart_id, :product_id 
end 

,并在模型中的“产品”类有一个方法这样的定义:

class Product < ActiveRecord::Base 

has_many :line_items 

    private 

    # ensure that there are no line items referencing this product 
    def ensure_not_referenced_by_any_line_item 
     if line_items.empty? 
     return true 
     else 
     errors.add(:base, 'Line Items present') 
     return false 
     end 
    end 

所以在哪里,我们甚至定义,我们使用它像line_items:line_items?它如何知道它指的是什么?它是否知道基于一些命名约定魔术?它如何将这个line_items连接到LineItems类?如果你能解释这两者如何连接在一起会很好。

回答

2

是的,这是'Rails magic'的作品。定义关联时(在这种情况下,通过使用belongs_tohas_many,Rails会根据关联对象的名称创建一堆方法。因此,在这种情况下,产品添加了一个方法.line_items,该方法返回一个关系(基本上是一个表示数据库查询的对象)当代码执行该关系时,它执行查询并返回一个LineItem对象数组。诸如分配关联对象(@line_item.product = Product.find(3))或创建新关联对象(@product.create_line_item(:title => 'foo'))。

This guide给出了详细信息,包括我的列表由各种关联创建的方法。

+0

啊我明白了。并且我们定义关联例如hasmany:XYZ这个XYZ必须以Rails通过查看它的名字了解哪个控制器的方式命名?例如,我们有一个名为line_items的控制器文件。因此,我们必须定义关联名称完全相同:line_items?感谢您的信息。 – Bohn

+1

当你说'has_many:things'时,你会得到一个'.things'方法,一个'.create_thing'方法,以及所有其他的方法。默认情况下,符号(':things')与相关模型的名称('Thing')匹配,但它们不需要 - 如果不指定'has_many',则可以使用参数指定类名比赛。如果你这样做,这些方法基于符号而不是类名(因此关联是'has_many:things',但类是实际的'Widget',该方法仍然是'.things' – MrTheWalrus

相关问题