Rails:如何将has_one转换为has_many关联

时间:2014-08-13 04:07:24

标签: ruby-on-rails has-many has-one

假设

class Kid < ActiveRecord::Base
    has_one :friend
end

class Friend< ActiveRecord::Base
  belongs_to :kid
end

如何将其更改为

class Kid < ActiveRecord::Base
    has_many :friends
end

class Friend< ActiveRecord::Base
  belongs_to :kid
end

非常感谢您的见解......

2 个答案:

答案 0 :(得分:7)

<强>集合

最重要的是,如果您将关联更改为has_many :x关系,则会创建关联数据的集合;而不是像单一关联那样的单个对象

这里的差异与其实现无关,但对于在整个应用程序中如何使用关联有很多影响。我将解释两者


<强>修正

首先,您是正确的,因为您可以将has_one :friend更改为has_many :friends。您需要小心了解为什么这有效:

enter image description here

ActiveRecord关联通过在数据表中关联名为foreign_keys的内容来工作。这些是对父类的"primary key"(ID)的列引用,允许Rails / ActiveRecord 关联它们

只要您为所有foreign_key个对象维护Friend s,就可以让系统正常运行。

-

数据

要扩展这个想法,您必须记住,当您创建has_many关联时,Rails / ActiveRecord将在每次引用关联时提取许多记录。

这意味着如果您拨打@kind.friends,您将不再收到单个对象。您将收到数据表中的所有对象 - 这意味着您必须调用.each循环来操作/显示它们:

@kid = Kid.find 1
@kid.friends.each do |friend|
   friend.name
end

如果在执行此更改后,您在save上调用order.save方法时会遇到问题,告诉您它已经存在,并且它不允许您实际拥有许多order个记录customer您可能需要调用orders.save(:validate =&gt; false)

答案 1 :(得分:3)

你已经回答了这个问题。如你所示,只需在模型中更改它。