1

条件を介して has_many に関連付けられた次のモデルがあります。

(属性Membershipの存在を検証することに注意してください)kind

class User < ActiveRecord::Base
  has_many :memberships
  has_many :founded_groups,
    :through => :memberships,
    :source  => :group,
    :class_name => 'Group'
    :conditions => {'memberships.kind' => 'founder'}
  has_many :joined_groups, ... # same as above, but the kind is 'member'
end

class Group < ActiveRecord::Base
  has_many :memberships
  has_many :founders, ...        # these two mirror the User's
  has_many :regular_members, ... #
end

class Membership < ActiveRecord::Base
  validates_presence_of :user_id
  validates_presence_of :club_id
  validates_presence_of :kind   # <-- attention here!

  belongs_to :user
  belongs_to :group
end

Rails は上記のコードを気に入っているようです (少なくとも、吠えることはありません)。しかし、これが起こります:

> user = User.create(...) # valid user
> club = Club.create(...) # valid club
> user.founded_clubs = [club]

ActiveRecord::RecordInvalid: Validation failed: kind can't be blank

> club.founders << user

ActiveRecord::RecordInvalid: Validation failed: kind can't be blank

Railsがコードの一部を取り、関連付けを作成するときにそれを使用すると想定してい{'memberships.kind' => 'founder'}ましたが、そうではないようです。したがって、新しいメンバーシップkindは空白であり、エラーがスローされます。

完全な苦痛を伴うことなく、関連付けを作成する簡単な方法はありますか?

4

1 に答える 1

2

これは確かに機能します:

> user = User.create(...) # valid user
> club = Club.create(...) # valid club
> user.memberships.create(:club_id => club.id, :kind => 'founder')

よくわかりませんが、これでうまくいく可能性があります。

> user.memberships.create(:club => club, :kind => 'founder')
于 2012-09-26T12:44:00.633 に答える