Ассоциация ActiveRecord без внешнего ключа - PullRequest
3 голосов
/ 25 октября 2010

Я пытаюсь построить модель отношений между пользователями. Пользователь может либо инициировать отношение, либо получить отношение от другого пользователя. Поэтому таблица отношений в БД имеет внешние ключи initiator_id и receient_id.
Теперь я могу выяснить, какие отношения пользователь инициировал или получил, используя следующие ассоциации:

has_many :initiated_relations, :foreign_key => :initiator_id, :class_name => 'Relation', :dependent => :destroy
has_many :received_relations,  :foreign_key => :recipient_id, :class_name => 'Relation', :dependent => :destroy

То, что я пытаюсь сделать, - это создать ассоциацию, которая выберет мне все отношения, принадлежащие пользователю (как инициированные, так и полученные) Попытка следующего не работает, и жалуется на отсутствие поля «user_id»:

has_many :relations, :conditions => 'recipient_id = #{id} or initiator_id = #{id}'

Как я могу создать ассоциацию, основанную исключительно на поле условий, не ища default_key по умолчанию? Или, может быть, существует совершенно другой подход к решению этой проблемы?

Ответы [ 2 ]

8 голосов
/ 25 октября 2010

Из ваших комментариев к ответу @ neutrino я понимаю, что вам нужно только это "отношение" для операций только для чтения.Если вы на Rails 3, вы можете использовать тот факт, что он использует ленивую выборку.Метод where() возвращает объект ActiveRecord::Relation, который вы можете позже изменить.Таким образом, вы можете определить метод следующим образом:

def User < ActiveRecord::Base
  def all_relations
    Relation.where("initiator_id => ? OR recipient_id = ?", id, id)
  end
end

И затем вы можете сделать:

User.all_relations.where(:confirmed => true).all
5 голосов
/ 25 октября 2010

Ну, я могу подумать об использовании finder_sql для этого:

has_many :relations, :finder_sql => 'select * from relations right outer join users
    on relations.recipient_id = #{id} or relations.initiator_id = #{id}'

Кроме того, вы можете просто написать метод, который будет возвращать объединенный массив двух ассоциаций отношений, но вы потеряете преимущество интерфейса ассоциации (фу).

Возможно, кто-то найдет лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...