0

这是我的模型:

团队:

class Team < ActiveRecord::Base

  has_many :team_users

  has_many :users, through: :team_users

  has_many :admins, through: :team_users,
                    foreign_key: :user_id,
                    class_name: 'User',
                    source: :user,
                    conditions: ["team_users.is_admin = ?", true]
end

用户:

class User < ActiveRecord::Base

  has_many :team_users

  has_many :teams, through: :team_users

  has_many :administered_teams, through: :team_users,
                                foreign_key: :user_id,
                                class_name: 'Team',
                                source: :team,
                                conditions: ["team_users.is_admin = ?", true]


end

团队用户:

# == Schema Information
#
# Table name: team_users
#
#  id       :integer          not null, primary key
#  team_id  :integer
#  user_id  :integer
#  is_admin :boolean
#

class TeamUser < ActiveRecord::Base
  belongs_to :team
  belongs_to :user

  # Validations
  validates_presence_of :team
  validates_presence_of :user

  attr_accessible :is_admin

end

所以本质上team.usersteam.admins通过同一张表连接的。请注意,要成为 a team.admin,您必须是team.user.

我的问题是,is_admin当我追加到时如何自动保存在 joiner-model 中team.admins?IE:

irb(main):001:0> user = User.find(1)
irb(main):002:0> team = Team.create
irb(main):003:0> team.admins << user
irb(main):004:0> team.users.count
              => 1
irb(main):005:0> team.admins.count
              => 0

irb(main):007:0> y team.team_users
               - !ruby/object:TeamUser
                 attributes:
                   id: 307
                   team_id: 210
                   user_id: 1
                   is_admin: 
                     => nil

我记得模糊地看到某个地方自动设置了 has_many 条件。但我不确定木匠模型是否属于这种情况?或者也许我做错了并且有更好的实现?

更新

这个问题似乎与这个问题非常相似

4

2 回答 2

1

更新

根据您在对另一个答案的评论中链接到的问题中给出的建议,如果将条件哈希分配给连接模型而不是 has_many_through 关联,则可以解决此问题:

class Team < ActiveRecord::Base
  # standard join model
  has_many :team_users

  # join model with conditions
  has_many :team_admins, class_name: 'TeamUser', conditions: {is_admin: true}

  # uses standard join association
  has_many :users, through: team_users

  # uses the conditional join association
  has_many :admins, through: team_admins, source: user
end

team.admins << user
team.admins.count
=> 1

原始答案

不要通过adminshas-many-through 关联追加。而是像这样附加:

team.team_users << TeamUser.new(user: user, is_admin: true)

或者你可以只使用魔法create_助手方法:

team.create_team_users(user: user, is_admin: true)
于 2013-04-16T20:59:39.453 回答
1

尝试将条件选项从 SQL 片段更改为哈希。

来自 Rails 的 API 文档:

如果使用哈希,则从关联中创建的记录是有范围的。 将使用或has_many :posts, :conditions => {:published => true}创建已发布的帖子。@blog.posts.create@blog.posts.build

在您的情况下,它将变为:

has_many :administered_teams, through: :team_users,
                              foreign_key: :user_id,
                              class_name: 'Team',
                              source: :team,
                              conditions: { team_users: { is_admin: true }}
于 2013-04-17T03:41:58.643 回答