Соединение двух моделей параллельного соединения в Rails - PullRequest
1 голос
/ 19 января 2011

Допустим, у меня есть проекты, пользователи и два способа подключения пользователей к проектам - 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, но оно пахнет так, как будто оно привлечет ошибки, связанные с синхронизацией.

У кого-нибудь есть идеи получше?

1 Ответ

0 голосов
/ 19 января 2011

Вы можете использовать параметр: condition для указания отношения has_one или has_many:

has_one ... :conditions => lambda{ ['project_id = ? AND user_id = ?', self.project_id, self.user_id] }

Я думаю, вы также можете сделать это в сокращенном формате, но убедитесь, что вы используете одинарные кавычки, а не двойныецитаты в вашем определении:

has_one ... :conditions => 'project_id = #{project_id} AND user_id = #{user_id}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...