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.usersに とteam.adminsは同じテーブルを介して結合されます。team.adminであるためには、 である必要があることに注意してくださいteam.user

is_admin私の質問は、に追加するときに自動的にジョイナーモデルに保存するにはどうすればよいteam.adminsですか? すなわち:

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 に答える