ActiveRecord, двойная принадлежность - PullRequest
1 голос
/ 07 ноября 2011

У меня есть 2 модели: Link и User, такие как:

class Link < ActiveRecord::Base
  belongs_to :src_user
  belongs_to :dst_user
end

class User < ActiveRecord::Base
  has_many :links
end

Схема может выглядеть следующим образом:

+----------+     +------+
| Link     |     | User |
+----------+     |------+
| src_user |---->|      |
| dst_user |---->|      |
+----------+     +------+

Мой вопрос: как мне отредактировать модель User, чтобы сделать это

@user.links # => [list of links]

(... который должен запрашивать @ user.src_users + @ users.dst_users, с уникальностью, если возможно.)

Можем ли мы сделать это только с использованием SQL внутри ActiveRecord? Большое спасибо.

(примечание: я на Rails 3.1.1)

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

Вы должны указать несколько отношений внутри пользовательской модели, чтобы она знала, к какой конкретной ассоциации она будет присоединена.

class Link < ActiveRecord::Base
  belongs_to :src_user, class_name: 'User'
  belongs_to :dst_user, class_name: 'User'
end

class User < ActiveRecord::Base
  has_many :src_links, class_name: 'Link', inverse_of: :src_user
  has_many :dst_links, class_name: 'Link', inverse_of: :dst_user
end

Опция: class_name должна быть указана, поскольку имя ассоциации не просто: links. Вам также может понадобиться указать параметр: inverse_of в модели Link, но я не уверен в этом. Хотя, если бы ты это сделал, не повредило бы.

Чтобы сделать звонок @ user.links, вам нужно сделать что-то вроде этого:

class User < ActiveRecord::Base
  def links
    Link.where(['src_user = ? OR dst_user = ?', self.id, self.id])
  end
end

… поскольку ActiveRecord не позволяет объединять две ассоциации на одной модели в одну.

0 голосов
/ 07 ноября 2011

Это звучит очень похоже на проблему ребенка / матери / отца, которая имеет решение.То есть проблема, когда объект одного типа belongs_to более одного объекта того же типа (не обязательно того же типа, что и дочерний объект, но объекты, к которым он принадлежит, сами по себе являются одним и тем же типом).

Это решение довольно старое и может не соответствовать последним схемам стилей в Rails3, но оно должно работать нормально или с очень небольшими изменениями.http://railsforum.com/viewtopic.php?id=1248

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