Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails中多对多的正确实现?_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails RubyonRails中多对多的正确实现?

Ruby on rails RubyonRails中多对多的正确实现?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,新手问题,当心!我想在Rails中实现一个基本的多对多关系,并试图找出哪种方法被认为是最“Rails方式”。在传统的非ActiveRecord数据库中,我刚刚创建了两个表和一个连接表,并编写了一组逻辑,以确保在对其中任何一个表执行操作时考虑到所有三个表 这是我第一次使用ORM,因此我试图找出ActiveRecord是否以某种方式为您简化了该过程,可能不需要手动创建连接表 Railscasts似乎是Rails智慧的著名来源,这两种方式是真正的“Rails方式”还是我可以做得更好 Railscast

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

这是我第一次使用ORM,因此我试图找出ActiveRecord是否以某种方式为您简化了该过程,可能不需要手动创建连接表


Railscasts似乎是Rails智慧的著名来源,这两种方式是真正的“Rails方式”还是我可以做得更好

Railscasts是最可靠的智慧来源:)Rayan Bates教授解决ruby on rails应用程序问题的真正“rails方法”。你绝对应该这样做

但是如果你想了解更多关于关联的信息,请点击这个链接


快乐编码

基本上有两种方式:
has_和_属于_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(...)

更常见的模式是连接模型方法,因为它的多功能性和更好的建模,尽管仍在使用
habtm
s。它们是二维的,你真的需要检查你在做什么,并确保没有更丰富的行为需要建模。

正如其他人所提到的,Rails使使用或都非常容易

我不会说其中一个比另一个“更正确”,它只是取决于您需要做什么,特别是您需要如何操作连接的模型。讨论了两者之间的决定


(所有这些参考资料都来自已经提供的协会文件。)

考虑到AFAIK对做事的“Rails方式”没有严格的定义,这似乎相当主观。FWIW,Railscast链接中的第二个例子是我是如何在Rails中学习多对多的。谢谢你的回复!请注意,在使用连接模型方法(第二种解决方案)时,放置外键约束的最佳方法是什么?例如,假设您不能创建没有与之关联的现有书签的站点。您可以使用迁移在数据库级别添加约束,然后使用模型上的验证进行备份。上面编辑的示例显示了您想要的验证。
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(...) )