gpt4 book ai didi

ruby-on-rails - Ruby on Rails 中多对多的正确实现?

转载 作者:行者123 更新时间:2023-12-03 00:38:50 25 4
gpt4 key购买 nike

新手问题,请注意!我想在 Rails 中实现基本的多对多关系,并且我试图找出哪种方法被认为是其中最“Rails 方式”。在传统的非 ActiveRecord 数据库中,我刚刚创建了两个表和一个联结表,并编写了一堆逻辑,以确保在对其中任何一个表执行操作时都考虑到所有三个表。

这是我第一次使用 ORM,因此我试图找出 ActiveRecord 是否能够以某种方式简化您的流程,也许不需要手动创建联结表。

Railscasts 似乎是 Rails 智慧的可靠来源,这个转换中的两种方法是真正的“Rails 方法”还是我可以做得更好? -http://railscasts.com/episodes/47-two-many-to-many

最佳答案

基本上有两种方法:has_and_belongs_to_many (habtm) 和带有指向另一个关联的 :through 选项的 has_many。两者都需要连接表;后者就是我们所说的连接模型,因为您通常会向连接添加更多信息。

例如,考虑一个具有为站点添加书签的用户模型的应用程序。一种方法是将其实现为 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 表,该表必然缺少主键。

这样做的问题是您可能想要在其上存储附加信息,因此您不妨使用连接模型,在本例中为书签:

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 仍然有所使用。它们是如此二维,以至于您确实需要检查您正在做的事情,并确保没有一些更丰富的行为也需要建模。

关于ruby-on-rails - Ruby on Rails 中多对多的正确实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7322230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com