2012-11-12 129 views
0

我有一個小應用程序,允許用戶上傳食譜並保存喜歡的食譜。我有一個名爲國家的單獨模式,它擁有世界上所有的國家,然後允許用戶從下拉列表中選擇一個國家。爲什麼這個協會有效?

起初我有關聯作爲

配方

has_one :country 

國家

belongs_to :recipe 

經過一番研究正確的關聯是

配方

belongs_to :country 

國家

belongs_to :recipe 

外鍵COUNTRY_ID配方模型中去。

我會做一些更多的閱讀,但不知道如果有人可以,爲什麼它是該協會解釋,而不是第一個

回答

2

我來賓:

  • 國家可以有許多配方
  • 配方屬於一個國家

如果是這樣,您應該定義的關聯是:

國家:

has_many :recipes 

配方:

belongs_to :country 

,我認爲你的第二個聯想也是不正確的。

當您在配方模型中定義belongs_to :country時,這意味着您的配方表必須有一個名爲country_id的列。這是國家模式的外鍵。

在第一個定義關聯中,Country模型將有一個名爲recipe_id的列,所以,每個國家只有一個配方,這不是你想要的,對吧?爲什麼這不起作用?因爲一個國家只有一個記錄,所以一個國家只能有一個配方,通過recipe_id訪問。

隨着第一聯想,你的公會是一到一個(1個國家有一個配方),而你真正想要的關聯是一個一對多(1個國家有許多配方)。所以這就是爲什麼第一個協會不起作用的原因(第二個)。

您需要記住的主要內容是,您將哪個模型放入belongs_to關聯,該模型將有一個名爲'association name'_id的列。使用has_onebelongs_to之間的不同之處僅是你把外鍵協會的意義。檢查here更清晰。

+0

感謝您的解釋,是的我希望能夠爲多個食譜指定相同的國家 – Richlewis

1

我不知道這是正確的關聯。 belongs_to關聯始終在具有外鍵的模型中使用(請參閱here)。據我所知,在兩張表中都有外鍵並不是一個好主意。你能解釋爲什麼你認爲最後一次關聯是正確的嗎?

順便說一句,我認爲正確的關聯是: 國家的has_many配方和配方belongs_to的國家,你想建立關聯這樣

+0

那麼我最初開始與has_one:國家在食譜模型,但在提出問題後,這個解決方案爲我工作,我認爲最後一個協會工作的原因是,它可以在應用程序內工作。但是我想了解它,也許這就是爲什麼我不這樣做是不正確的? – Richlewis

+0

我不知道這是爲什麼工作。據我所知,寫國家belongs_to配方是錯誤的。如果我正確理解模型,每個配方只能引用一個國家,而每個國家可能有很多配方。在軌道中建模的標準方法將是我上面描述的方法。 – davidrac

+0

是的,你的方式確實更有意義,我可以理解。我會稍後改變它,看看是否仍然有效,但即時通訊猜測沒有問題,我沒有測試過,它似乎會失敗的是,如果我從同一個國家創建2個食譜 – Richlewis