为什么这个协会有效?

时间:2012-11-12 09:21:38

标签: ruby-on-rails-3 activerecord

我有一个小应用程序,允许用户上传食谱并保存最喜欢的食谱。我有一个名为country的独立模型,其中包含世界上所有国家/地区,然后允许用户从下拉列表中选择一个。

最初我的关联是

配方

has_one :country

国家

belongs_to :recipe

经过一些研究后,正确的关联是

配方

belongs_to :country

国家

belongs_to :recipe

配方模型中的外键country_id。

我打算做更多阅读,但想知道是否有人可以解释为什么这是这种关联,而不是第一个

2 个答案:

答案 0 :(得分:2)

我是客人,你想建立这样的协会:

  • 国家可以有很多食谱
  • 食谱属于一个国家

如果是这样,您应该定义关联:

国家:

has_many :recipes

配方:

belongs_to :country

我认为您的第二次关联也是错误的。

在食谱模型中定义belongs_to :country时,这意味着您的食谱表必须有一个名为country_id的列。它是Country模型的外键。

在第一个定义关联中,Country模型将有一个名为recipe_id的列,因此,每个国家/地区只有一个食谱,这不是您想要的,对吧?为什么它不起作用?因为一个国家/地区只有一个记录,所以一个国家/地区只能有一个食谱,可通过recipe_id访问。

通过第一次关联,您的关联一对一(一个国家/地区有一个食谱),而您实际上希望您的关联一对多(一个国家有很多食谱)。所以这就是为什么第一次关联不起作用的原因(第二次也是如此)。

您需要记住的主要事项是,您放置belongs_to关联的模型,该模型将有一个名为'association name'_id的列。使用has_onebelongs_to之间的区别仅在于您放置外键表示关联的含义。检查here更清楚。

答案 1 :(得分:1)

我不确定这是正确的关联。 belongs_to关联始终在具有外键的模型中使用(请参阅here)。据我所知,在两个表中都有外键并不是一个好主意。你能解释为什么你认为最后的关联是正确的吗?

顺便说一句,我认为正确的关联是: country has_many食谱和食谱belongs_to国家