Как сделать связь между двумя таблицами без ожидаемых внешних ключей по рельсам? - PullRequest
0 голосов
/ 21 декабря 2011

Учитывая следующие две модели:

User (id)
FbFriendCache(user_id,fb_user_id)

Я хотел бы иметь возможность сделать: @ user.facebook_friends

Что бы вернуть @users из пользовательской модели

Я пробовал:

class User < ActiveRecord::Base

  has_many :fb_friends,
    :through => :fb_friend_cache,
    :foreign_key => "fb_user_id"

Но это не удалось w Не удалось найти связь.

Идеи?Спасибо

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Сначала необходимо определить ассоциацию facebook_friends_cache:

has_many :facebook_friend_cache, :class_name => "FacebookFriendCache"

Затем необходимо определить ассоциацию :through:

has_many :fb_friends, :through => :facebook_friend_cache, :foreign_key => :user_id

Здесь foreign_keyдолжно быть поле, представляющее идентификатор объекта User во внешней таблице, поэтому оно должно быть user_id, а не fb_user_id.

Я бы действительно дал facebook_friend_cache лучшее имятоже.

1 голос
/ 21 декабря 2011

Я публикую это как ответ, так как не могу предоставить фрагмент документации в комментариях.Решение Райана требует настройки.

Свойство foreign_key игнорируется для has_many :through ассоциаций.Вместо этого следует использовать свойство source.

: через

Указывает связь, посредством которой выполняется запрос.Это может быть любой другой тип ассоциации, в том числе другой: через ассоциации. Опции для: class_name,: primary_key и: foreign_key игнорируются, так как ассоциация использует отражение источника.

..

: источник

Указывает имя ассоциации источника, используемое has_many: посредством запросов.Используйте его, только если имя не может быть выведено из ассоциации.has_many: подписчики,: через =>: подписки будут искать: подписчики или: подписчика в подписке, если не указан источник:

Должно работать следующее решение:

class User < ActiveRecord::Base
  has_many :fb_friend_cache
  has_many :facebook_friends, :through => :fb_friend_cache, :source => :fb_user
end

class FbFriendCache < ActiveRecord::Base
  belongs_to :user
  belongs_to :fb_user, :class_name=>"User"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...