所以我是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
这是个好方法吗?我应该使用has_and_belongs_to_many
吗?我特别关注以下场景:假设一个用户有100个最喜欢的项目。当我进行User.find(id)
时,我是否也会检索100个收藏夹和100个项目?
如果它很重要:ruby版本1.9.3,rails版本3.2.11
你能试试has_many => :through
吗?
class User < ActiveRecord::Base
has_many :favorites
has_many :items, :through => :favorites
//other code
end
在您的情况下,has_many:through绝对是一条路。我建议阅读:http://guides.rubyonrails.org/association_basics.html
对您的问题特别感兴趣:
2.8在has_many:through和has_and_belongs_to_many 之间进行选择
Rails提供了两种不同的方法来声明模型之间的多对多关系。更简单的方法是使用has_and_belongs_to_any,它允许您直接建立关联:
class Assembly < ActiveRecord::Base
has_and_belongs_to_many :parts
end
class Part < ActiveRecord::Base
has_and_belongs_to_many :assemblies
end
声明多对多关系的第二种方法是使用has_many:through。这通过一个连接模型间接地建立了关联:
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
最简单的经验法则是,如果您需要将关系模型作为一个独立的实体来处理,那么您应该设置一个has_many:through关系。如果您不需要对关系模型做任何操作,那么设置has_and_bellongs_to_many关系可能会更简单(尽管您需要记住在数据库中创建联接表)。
如果您需要对联接模型进行验证、回调或额外的属性,则应该使用has_many:through。
这比使用has_and_belongs_to_many
要好。
当我做User.fund(id)时,我也会检索100个收藏夹以及100个项目?
没有。你只会得到用户对象。
更新:如果您想从用户对象多次调用items表,那么调用User.include(:favourites, :items).find(id)
将使您加入表。