Rails - 寻找父母和祖父母的关联

时间:2016-01-04 22:40:20

标签: ruby-on-rails

假设我有这些模型

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可以添加到GroupTeam
  • Group可以添加到Team

对于此代码,

User.first.teams

我希望获得第一个Team所属的所有User,或者直接添加到团队中,或者通过Team添加到Group

我本可以添加一个新方法或关联扩展来获取所有可传递的团队,但我希望user.teams能够正常工作,因为Group模型是新添加的,并且已经有大量代码使用{ {1}}。

我还尝试在user.teams模型中添加名为teams的实例方法,该方法将传递团队作为关系对象返回,以便范围继续有效。但是,如果范围使用链接表中的任何内容,则无法在链接表上查找列。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

听起来你正在使用正确的黑客工作。

您的设置是has_and_belongs_to_manyhas_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

您的模式很糟糕,因为您正在交换groupsteams

Ruby是object orientated; Rails是面向对象的。

如果User对象属于某个团队,那就是一件事。

如果同一个对象可以属于另一个对象,则必须质疑另一个对象的范围。简而言之;为什么用户可以成为组的成员?