2015-06-11 42 views
0

我想創建一個飲料數據庫。積極記錄關係rails confusion

每種飲料都有很多成分,並且成分有很多劑量。

因此,一種成分屬於劑量和劑量屬於雞尾酒。

但是,一旦我刪除喝我想刪除相關的劑量,但不是因爲成分可以在其他飲料中使用。

目前我正在考慮像這樣構建我的數據庫。

rails g model drink name:string dose_id:references 
rails g model dose cl:string ingredient_id:references 
rails g model ingredient name:string 

問題:

1)請問這適合我的需求,還是我錯過了什麼?

2)我需要雞尾酒和成分或之間的關係,通過這個劑量呢?如果是/否,爲什麼?

3)這是否:引用做任何事情比FK鏈接到其他PK?

4)爲命名重要的:引用,它是如何檢測錶鏈接到?

回答

2

您可以在導軌上閱讀關於參考和移植的更多信息,但這裏有一些想法。

  1. 你似乎錯過了一些東西。你想drink有很多ingredients。爲dose添加對drink的引用意味着drink只屬於一個dose,因爲它一次只能存儲一個dose_id

  2. 您可能需要drinkingredients之間的多對多關係。 A drink可以有許多ingredients。一種成分可以是許多drink的一部分。 dose實際上可以成爲更成功的方式。

    rails g model drink name:string 
    rails g model dose cl:string ingredient:references drink:references 
    rails g model ingredient name:string 
    
  3. 它應該只是表現得像在SQL典型REFERENCES約束。這裏有一些關於下面的內容,但是在Rails中,它也會在列上添加一個btree索引。

    a。 http://www.postgresql.org/docs/9.4/static/ddl-constraints.html#DDL-CONSTRAINTS-FK

    b。 How to use the keyword 'references' in MySQL?

  4. 它在生成遷移時將引用關係中的模型名稱複數化。

    rails g model dose ingredient:references變得像在架構如下:

    ... 
        add_index "doses", ["ingredient_id"], name: "index_doses_on_ingredient_id", using: :btree 
        add_foreign_key "doses", "ingredients" 
    
2

我假設你使用MySQL和Ruby 2.我建議你可以組織你的模型是這樣的:

class Drink < ActiveRecord::Base 
    has_many :doses, dependent: :destroy 
    has_many :ingredients, through: :doses 
end 

class Dose < ActiveRecord::Base 
    belongs_to :drink 
    belongs_to :ingredient 
end 

class Ingredient < ActiveRecord::Base 
    has_many :doses, dependent: :restrict 
    has_many :drinks, through: :doses 
end 

Rails中的關係遵循的一些約定:

  • 表名是複數表格
  • 型號名稱爲單數形式
  • 外鍵被命名爲:othertable_id
  • 保存belongs_to關係的模型還包含外鍵(在您的情況下,這將是:drink_id:ingredient_id)。
  • :through語句生成SQL爲你連接語句,所以可以說my_drink.ingredientsmy_ingredient.drinks
  • dependent: :destroy將銷燬您的:doses當一個飲料被刪除,但不是ingredients鏈接到它。
  • dependent: :restrict將拒絕刪除的成分,仍然是由一個或多個劑量

我一直在使用的連接表的額外模型(你可以跳過的,和Rails會做的魔術給你)。但最大的好處是,您可以將額外的屬性存儲到該模型中,如金額,單位......並且您的ruby代碼中也很清楚,這些關係來自何處。

這些模型沒有經過測試,我不是100%肯定,如果:through語法是否正確。但你應該明白這個主意。

+0

謝謝你,這是很有見地! –

+1

不客氣,讓我知道如果你需要別的東西。 – 23tux