Rails多种关联类型

时间:2014-10-09 13:02:51

标签: ruby-on-rails associations has-many-through has-many

您是否可以在没有任何方法调用冲突的情况下建立has_many belongs_to关系和has_many :through关系?

例如,user.hacks会返回什么 - 用户发布的黑客攻击,或用户标记为收藏的黑客攻击?

我需要能够同时访问这两个结果。

class User < ActiveRecord::Base
  has_many :hacks, through: :favorites

  has_many :hacks
end

class Hack < ActiveRecord::Base
  has_many :hacks, through: :favorites

  belongs_to :users
end

class Favorite < ActiveRecord::Base
  belongs_to :user
  belongs_to :hack
end

3 个答案:

答案 0 :(得分:4)

has_many根据关系名称定义方法。

这意味着,如果您使用相同的名称但不同的选项多次定义关系,则最后一个定义将覆盖先前定义调用的方法。

因此,您无法使用相同的名称定义它们。

如果你需要访问这两种,黑客和最喜欢的黑客,你必须创建如下关系

class User < ActiveRecord::Base
  has_many :hacks
  has_many :favorites
  has_many :favorited_hacks, through: :favorites, source: :hack
end

答案 1 :(得分:0)

我不知道它会返回什么,请在控制台中尝试。 但是我会在用户类中使用类似的东西(未测试,但您可以查看如何别名关系):

has_many :favorite_hacks, through: :favorites, class: :hacks

Hack中似乎有一个错字。

另一方面,你这样做的方式对我来说似乎很奇怪。用户hack关系似乎是所有权,而用户 - fav似乎是书签。

答案 2 :(得分:0)

如果你想要的是获得所有最喜欢黑客的列表(并且所有黑客都属于用户),那么我认为对这种行为进行建模是一个更好的主意:

class User < ActiveRecord::Base
  has_many :hacks
end

class Hack < ActiveRecord::Base
  belongs_to :user

  scope :favorite, -> { where(favorite: true) }
end

favorite模型上只有一个Hack属性。然后,您可以通过调用user.hacks.favorite找到收藏夹。

相关问题