您是否可以在没有任何方法调用冲突的情况下建立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
答案 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
找到收藏夹。