2014-10-02 114 views
0

我有一個名爲Topic的模型,另一個名爲Product。你如何將一個模型與另一個模型相關聯?

這裏的主題模型的外觀,

class Topic < ActiveRecord::Base 
    belongs_to :product 
end 

話題欄目「稱號」和「體」。

而這裏的產品,

class Product < ActiveRecord::Base 
    has_many :topics 
end 

產品具有列 「名稱」 和 「說明」。名稱是唯一的。

當我創建一個新的主題時,只有當名稱不存在時,我才希望主題的標題存儲在產品名稱中。如果是這樣,它不應該做任何改變。

但我該怎麼做?

更新:

用戶進入/主題頁面,輸入標題和正文。

Topics_controller應該做什麼, 1.閱讀用戶給出的標題。 2.檢查產品中是否存在標題。 3.如果不添加它。 4.如果有,請不要做任何事情。

我不明白這兩個模型如何鏈接在一起,以及如何從模型中訪問記錄。

回答

2

您可以通過使用ActiveRecord提供的callbacks之一來實現此目的。

我不知道如果我理解你的要求完美,所以也許你需要更改下面的例子:

class Topic < ActiveRecord::Base 
    belongs_to :product 
    before_save :add_product_name 

    private 

    def add_product_name 
     self.product.name ||= self.title if Product.find_by(name: self.title).nil? 
    end 
end 
+0

這是相當多我所需要的!不幸的是,當產品表沒有名稱與主題表中的記錄標題相匹配的記錄時,代碼會中斷。基本上我必須在主題表中創建記錄之前在產品表中創建記錄。 – 2014-10-02 12:16:35

+0

是的,那可能是真的。我改變了作業的條件。 – Robin 2014-10-02 12:26:56

+0

謝謝!我如何在產品頁面訪問這些主題?主題與產品之間的關係如何實際產生? – 2014-10-02 15:39:10

0

您可以編寫before_create回調:add_topic_name

如果這一方法找到主題的產品名稱並將其分配給產品的標題。

0

您的要求有點不清楚。從行爲的角度來看,你能指定你的最終目標嗎?

如果我理解正確,但爲什麼不只是覆蓋主題的標題方法。這樣你就不會複製數據庫中的數據。

您的主題類中:

class Topic < ActiveRecord::Base 
    def title 
     read_attribute(:title) || product.name # will get title of @topic if not nil, else product name 
    end 
end 
相關問題