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 在Rails中创建多对多关系_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 在Rails中创建多对多关系

Ruby on rails 在Rails中创建多对多关系,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我是Rails n00b,我想创建一个“收藏夹”关系,这样用户就可以拥有许多收藏夹项目。我不完全确定如何做到这一点,这是我将尝试的方式,但我不确定这是否是一个良好的做法: class User < ActiveRecord::Base has_many :favorites //other code end class Favorite < ActiveRecord::Base belong_to :user has_one :item end class Item &l

我是Rails n00b,我想创建一个“收藏夹”关系,这样用户就可以拥有许多收藏夹项目。我不完全确定如何做到这一点,这是我将尝试的方式,但我不确定这是否是一个良好的做法:

class User < ActiveRecord::Base
 has_many :favorites
 //other code
end

class Favorite < ActiveRecord::Base
 belong_to :user
 has_one :item
end

class Item < ActiveRecord::Base
 belongs_to :item
end
class用户
这是一个好方法吗?我是否应该使用has\u和\u属于\u many? 我特别关注以下场景:假设一个用户有100个最喜欢的项目。 当我执行
User.find(id)
操作时,我还会检索100个收藏夹和100个项目吗


如果这很重要:ruby 1.9.3版,rails 3.2.11版

你能试试
有多少个=>:through

class User < ActiveRecord::Base
 has_many :favorites
 has_many :items, :through => :favorites
 //other code
end
class用户:收藏夹
//其他代码
结束

你能试试通过
有多少

class User < ActiveRecord::Base
 has_many :favorites
 has_many :items, :through => :favorites
 //other code
end
class用户:收藏夹
//其他代码
结束

这比使用
has\u和\u属于\u many\u要好

当我做一个User.find(id)时,我还会检索100个收藏夹吗 那100件呢

不,您只需要获取用户对象

更新:
调用
User.include(:favorites,:items)。find(id)
将使您加入表中,以防您想从用户对象多次调用items表。

这比使用
has\u和\u归属\u many
更好

当我做一个User.find(id)时,我还会检索100个收藏夹吗 那100件呢

不,您只需要获取用户对象

更新:
调用
User.include(:favorites,:items)。find(id)
将使您加入表中,以防您想从用户对象多次调用items表。

在您的情况下,has\u many:through肯定是一种方法。我建议阅读:

关于你的问题,我特别感兴趣:

2.8在“有很多”之间选择:通过和“有很多”和“你属于很多”

Rails提供了两种不同的方法来声明模型之间的多对多关系。更简单的方法是使用has_和_besive_to _many,这允许您直接进行关联:

类程序集
声明多对多关系的第二种方法是使用has_many:through。这将通过连接模型间接建立关联:

类程序集:清单
结束
类清单:清单
结束
最简单的经验法则是,如果需要将关系模型作为一个独立的实体来使用,那么应该设置一个has_many:through关系。如果不需要对关系模型执行任何操作,则可以更简单地设置has_和_-belish_-to_-many关系(不过需要记住在数据库中创建联接表)

如果需要验证、回调或连接模型上的额外属性,则应该使用has_many:town


在你的情况下,有很多:通过肯定是一条路要走。我建议阅读:

关于你的问题,我特别感兴趣:

2.8在“有很多”之间选择:通过和“有很多”和“你属于很多”

Rails提供了两种不同的方法来声明模型之间的多对多关系。更简单的方法是使用has_和_besive_to _many,这允许您直接进行关联:

类程序集
声明多对多关系的第二种方法是使用has_many:through。这将通过连接模型间接建立关联:

类程序集:清单
结束
类清单:清单
结束
最简单的经验法则是,如果需要将关系模型作为一个独立的实体来使用,那么应该设置一个has_many:through关系。如果不需要对关系模型执行任何操作,则可以更简单地设置has_和_-belish_-to_-many关系(不过需要记住在数据库中创建联接表)

如果需要验证、回调或连接模型上的额外属性,则应该使用has_many:town


如果有必要,你会如何编写迁移?如果有必要,你会如何编写迁移?@Peter_de__Ridder这很有帮助,但是,我不确定是否需要创建迁移,或者rails是否自动在后台执行某些操作以使其正常工作,或者我是否必须在数据库中自己执行迁移,您可以将其添加到已完成的联接表迁移中。@Peter_de_Ridder这非常有帮助,但是,我不确定是否需要创建迁移,或者rails是否自动在后台执行某些操作以使其正常工作,或者是否必须在数据库中自己执行迁移,您可以将其添加到已完成的联接表迁移中。
class Assembly < ActiveRecord::Base
  has_many :manifests
  has_many :parts, :through => :manifests
end

class Manifest < ActiveRecord::Base
  belongs_to :assembly
  belongs_to :part
end

class Part < ActiveRecord::Base
  has_many :manifests
  has_many :assemblies, :through => :manifests
end