Реализации ActiveRecord has_many и own_to для внешнего ключа - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь понять синтаксис / мотивацию хэша опций ввода в ассоциациях has_many и own_to.(вопрос внизу)

Скажем, у меня есть две таблицы, пользователи и сообщения.у пользователя много постов, а пост принадлежит пользователю.Из того, что я понимаю, можно настроить ассоциации следующим образом:

(в модели пользователя)

has_many(:posts,
    primary_key: :id,
    foreign_key: :user_id, #this makes me think SQL is querying
                           #User.user_id, an invalid field
    class_name: "Post")

(в модели Post)

belongs_to(:user,
    primary_key: :id,
    foreign_key: :user_id, 
    class_name: "User")

Мой (ые) вопрос (ы) заключается в следующем: Как я могу интуитивно понять, почему функции own_to и has_many реализованы таким образом?то есть, почему не следует ожидать, что Foreign_key изменится при изменении того, какую связь вы определяете?Потому что, наивно, я ожидал бы, что ассоциации будут определены с различными внешними ключами, в зависимости от того, из какой таблицы исходит ваш запрос (а именно таблица class_name).Это просто вопрос соглашения?

Я посмотрел документы для has_many / own_to и думаю, что понимаю, как они реализованы, но я до сих пор не понимаю / почему / это реализовано именно так.Я чувствую, что поддержание постоянного внешнего ключа, независимо от того, какую таблицу вы запрашиваете, запутывает то, что происходит на уровне SQL.(но я надеюсь, что я просто упускаю что-то глупое)

edit: для ясности, это соединение, которое, как я наивно думал, имело больше смысла:

в модели пользователя

has_many(:posts,
    primary_key: :user_id, #because querying post table so treat this column
                          #as a primary key

    foreign_key: :id,      #because users is the 'secondary' table,  
                          #:id should be foreign
    class_name: "Post"
)

в модели Post

belongs_to(:user,
    primary_key: :id, #because querying User table, treat this as the
                     #primary key

    foreign_key: :user_id,  #because posts is the 'secondary' table we are 
                            #comparing to, :user_id should be foreign
    class_name: "User")

1 Ответ

0 голосов
/ 26 сентября 2019

Хех, вскоре после публикации я понял, в чем заключалась моя проблема (и это было определенно глупо): я думал о первичном / иностранном как о том, какая таблица запрашивается, а какая соединяется соответственно.Когда, на самом деле, мне следовало подумать, какой ключ является действительно первичным и внешним по отношению к базе данных.Я сомневаюсь, что это кому-нибудь поможет, но оставлю это на всякий случай, так как это вызвало у меня головную боль (хотя, вероятно, не должно было).

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