Допустим, у меня есть проекты, пользователи и два способа подключения пользователей к проектам - Rsvps и членство. Вот так:
class User < ActiveRecord::Base
has_many :memberships
has_many :rsvps
has_many :projects, :through => :memberships
end
class Project < ActiveRecord::Base
has_many :memberships
has_many :rsvps
has_many :members, :through => :memberships, :class_name => 'User'
end
class Rsvp < ActiveRecord::Base
belongs_to :project
belongs_to :user
end
class Membership < ActiveRecord::Base
belongs_to :project
belongs_to :user
end
Rsvps и членство достаточно различны по своим другим функциям, поэтому я не хочу объединять их в одну модель, но я хочу иметь возможность связывать Rsvps и членство. Мой сценарий идеального мира будет примерно таким:
class Membership < ActiveRecord::Base
has_one :rsvp, :through => [:project, :user]
end
но, очевидно, это несбыточная мечта.
Два потенциальных решения, о которых я до сих пор думал, пытаются выдумать ассоциацию с чем-то вроде
def rsvp
project.rsvps.find(:conditions => {:user_id => user_id})
end
но это далеко не идеально, поскольку оно не дублирует все забавные другие функции, которые идут с объектами Association. В качестве альтернативы я мог бы добавить поле membership_id
к Rsvp, но оно пахнет так, как будто оно привлечет ошибки, связанные с синхронизацией.
У кого-нибудь есть идеи получше?