ruby-on-rails – 在Ruby on Rails中正确实现多对多?
发布时间:2020-12-17 03:59:23 所属栏目:百科 来源:网络整理
导读:新手问题,要小心!我想在Rails中实现一个基本的多对多关系,并且我试图找出哪种方法被认为是它们中最“有轨”的方法.在传统的非ActiveRecord DB中,我刚创建了两个表和一个联结表,并编写了一堆逻辑,以确保在对其中任何一个执行操作时考虑所有三个表. 这是我第
新手问题,要小心!我想在Rails中实现一个基本的多对多关系,并且我试图找出哪种方法被认为是它们中最“有轨”的方法.在传统的非ActiveRecord DB中,我刚创建了两个表和一个联结表,并编写了一堆逻辑,以确保在对其中任何一个执行操作时考虑所有三个表.
这是我第一次使用ORM,因此我试图找出ActiveRecord是否可能以某种方式为您简化过程,可能不需要手动创建联结表. Railscasts似乎是Rails智慧的一个有信誉的来源,这个演员的两种方式真正“Rails方式”还是我可以做得更好? – http://railscasts.com/episodes/47-two-many-to-many 解决方法
基本上有两种方式:has_and_belongs_to_many(habtm)和has_many,其中:through选项指向另一个关联.两者都需要连接表;后者就是我们所说的连接模型,因为您通常会向连接添加更多信息.
例如,考虑具有用户模型的应用程序,该应用程序为“站点”设置书一种方法是将其作为一种habtm关系来实现 class User < ActiveRecord::Base has_and_belongs_to_many :sites end class Site < ActiveRecord::Base has_and_belongs_to_many :users end user.sites << Site.find(...) 此建模还需要创建sites_users表,该表必然缺少主键. 这个问题是您可能希望在其上存储其他信息,因此您可以使用连接模型,在本例中为Bookmark: class User < ActiveRecord::Base has_many :bookmarks has_many :sites,:through => :bookmarks end class Site < ActiveRecord::Base has_many :bookmarks has_many :users,:through => :bookmarks #edit: adding validation for requiring at least one bookmark validate_before_create :at_least_one_bookmark private def at_least_one_bookmark errors.add_to_base("requires at least one bookmark") unless bookmarks.count > 0 end end class Bookmark < ActiveRecord::Base belongs_to :user belongs_to :site end user.bookmarks.create(:site => Site.find(...) ) 更常见的模式是连接模型方法,因为它的多功能性和更好的建模,尽管仍然在某种程度上使用了habtms.它们只是如此二维,你真的需要检查你正在做什么,并确保没有一些更富有的行为也需要建模. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |