[英]Correct implementation of many-to-many in Ruby on Rails?
新手问题,要小心! 我想在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(...) )
更常见的模式是连接模型方法,因为它的多功能性和更好的建模,虽然habtm
仍然有点使用。 它们只是如此二维,你真的需要检查你正在做什么,并确保没有一些更富有的行为也需要建模。
Railscasts是最可靠的智慧来源:) Rayan Bates教授真正的“rails方式”来解决rails应用程序中的ruby问题。 你一定应该这样做。
但是,如果您想了解更多关于协会的信息,请点击此链接http://guides.rubyonrails.org/association_basics.html
快乐的编码!
正如其他人所提到的, 尽管使用has_and_belongs_to_many或has_many ,Rails使这一切变得非常简单。
我不会说一个人比另一个人“更正确”,它只取决于你需要做什么,特别是你需要如何操纵联合模型。 这里讨论它们之间的决定。
(所有这些引用都来自已提供的关联文档。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.