假设我有这些模型
class User
has_many: groups
has_many: teams, :as => :user
end
class Group
has_many: users
has_many: teams, :as => :user
end
class Team
end
基本上
User
可以添加到Group
或Team
Group
可以添加到Team
对于此代码,
User.first.teams
我希望获得第一个Team
所属的所有User
,或者直接添加到团队中,或者通过Team
添加到Group
。
我本可以添加一个新方法或关联扩展来获取所有可传递的团队,但我希望user.teams
能够正常工作,因为Group
模型是新添加的,并且已经有大量代码使用{ {1}}。
我还尝试在user.teams
模型中添加名为teams
的实例方法,该方法将传递团队作为关系对象返回,以便范围继续有效。但是,如果范围使用链接表中的任何内容,则无法在链接表上查找列。
有什么建议吗?
答案 0 :(得分:0)
听起来你正在使用正确的黑客工作。
您的设置是has_and_belongs_to_many
或has_many :through
的完美候选者;两者都代表many-to-many
关系......
#app/models/user.rb
class User < ActiveRecord::Base
has_and_belongs_to_many :teams #-> requires a users_teams table
end
#app/models/team.rb
class Team < ActiveRecord::Base
has_and_belongs_to_many :users
has_and_belongs_to_many :groups #-> requires a groups_teams table
end
#app/models/group.rb
class Group < ActiveRecord::Base
has_and_belongs_to_many :teams
end
...这样,您的团队将成为“群组”的一部分,可由@user.teams.first.groups
或类似人员访问。
-
如果你是微软,你可以说......
The Internet Services *group* has the Microsoft Edge *team*
@group = Group.find_by name: "Internet Services"
@team = @group.teams.find_by name: "Microsoft Edge"
@users = @team.users
如果您是用户,则可以使用:
@user = User.find x
@team = User.teams.find y
@group = @team.groups.find z
您的模式很糟糕,因为您正在交换groups
和teams
。
Ruby是object orientated; Rails是面向对象的。
如果User
对象属于某个团队,那就是一件事。
如果同一个对象可以属于另一个对象,则必须质疑另一个对象的范围。简而言之;为什么用户可以成为和组的成员?