Rails has_many :through с :conditions . Как создать ассоциации?

У меня есть следующие модели, связанные с 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

Я предполагал, что рельсы возьмут {'memberships.kind' => 'founder'} часть моего кода и будут использовать ее при создании ассоциации, но, похоже, это не так. Таким образом, kind нового членства пусто, и это вызывает ошибку.

Есть ли простой способ создать ассоциации, не создавая при этом полной боли?


person kikito    schedule 26.09.2012    source источник


Ответы (1)


Это точно сработает:

> 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')
person Marlin Pierce    schedule 26.09.2012
comment
Спасибо. Я надеялся найти какой-то синтаксис, который позволил бы мне создавать членства с учетом нескольких элементов — одного клуба и двух пользователей или одного пользователя и двух клубов. Кажется, мне просто придется перебирать многие части и создавать ассоциации вручную. Ну что ж. - person kikito; 26.09.2012