Как получить поле обратной связи, особенно с промежуточными таблицами - PullRequest
0 голосов
/ 25 марта 2020

Я хотел бы знать, как получить поле обратной связи, учитывая поле в модели. Например, если модель User имеет внешний ключ (т. Е. belongs_to) для модели Role, а модель Role имеет соответствующую ассоциацию has_many с моделью User, тогда AFAIK, настройка User.role - это то же самое, что добавить пользователя в Role.users. Я пытаюсь понять, как программно обнаружить, что Role.users - это обратное соотношение User.role.

Я знаю, как получить ассоциации ActiveRecord, используя отражения модели. В моем примере User.reflections['role'] даст ассоциацию belongs_to, а Role.reflections['users'] даст отражение has_many на "другой стороне". Я хочу знать, как программно выяснить, что Role.users является обратной ассоциацией User.role, и наоборот. В Django это обычно делается путем проверки свойства related_name.

Прямо сейчас я проверяю отражения и определяю, находится ли отражение на другой стороне, используя свойство foreign_key объектов отражения. , Например, и User.reflections['role'].foreign_key, и Role.reflections['users'].foreign_key вернут role_id.

Однако это не работает для некоторых ассоциаций, например, для многих-многих или :through. Некоторые другие методы, которые я пробовал, не работают, если модель имеет несколько ассоциаций с одной и той же моделью.

Как определить, какое отражение / поле в другой модели соответствует данному полю в конкретной модели

1 Ответ

0 голосов
/ 25 марта 2020

Вы можете использовать User.reflections['role'].inverse_of. Для этого он работает с :through ассоциациями - вам нужно явно указать inverse_of на обеих моделях. Например

class Tag < ApplicationRecord
  has_many :tag_connections, inverse_of: :tag, source: :post
  has_many :posts, through: :tag_connections, inverse_of: :tags
end

class TagConnection < ApplicationRecord
  belongs_to :tag
  belongs_to :post
end

class Post < ApplicationRecord
  has_many :tag_connections, inverse_of: :post
  has_many :tags, inverse_of: :posts
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...