2013-01-21 57 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

相關問題