Rails принадлежит к включает нераспознанные ассоциации второго порядка

У меня есть 3 вложенные модели в приложении Rails:

class User < ApplicationRecord
  has_many :products, dependent: :destroy
end

class Product < ApplicationRecord
  belongs_to :user
  has_one :insurance_policy
end

class InsurancePolicy < ApplicationRecord
  belongs_to :product, -> { includes :user }
end

Я стараюсь избегать:

InsurancePolicy.last.product.user

Используя добавление include к методу own_to, я получаю следующее сообщение об ошибке:

[10] pry(main)> InsurancePolicy.last.user
  InsurancePolicy Load (0.4ms)  SELECT  "insurance_policies".* FROM "insurance_policies" ORDER BY "insurance_policies"."id" DESC LIMIT $1  [["LIMIT", 1]]
NoMethodError: undefined method `user' for #<InsurancePolicy:0x00007fc50a2d5a10>
from /Users/albert/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/activemodel-5.2.0/lib/active_model/attribute_methods.rb:430:in `method_missing'

Почему отсутствует метод? Нужно ли мне добавлять столбец user_id в мою таблицу insurance_policies?

Я слежу за официальной документацией AR.

class LineItem < ApplicationRecord
  belongs_to :book, -> { includes :author }
end

class Book < ApplicationRecord
  belongs_to :author
  has_many :line_items
end

class Author < ApplicationRecord
  has_many :books
end

Это то, что мне не хватает? Я не очень понимаю:

If you use the select method on a belongs_to association, you should also set the :foreign_key option to guarantee the correct results.

Думаю, вам не хватает belongs_to :user в модели Product

Mahmoud Sayed 27.10.2018 15:51

Извините, я не писал это в моем stackoverflow, да в моем коде

AlbertMunichMar 28.10.2018 00:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
84
1

Ответы 1

Вызов InsurancePolicy.last.user неверен, потому что модель InsurancePolicy не связана с моделью User.

Ассоциация belongs_to :product, -> { includes :user } тоже неверна, потому что модель Product не имеет ассоциации с моделью User. Чтобы includes работал правильно, вам нужно добавить его в Product:

belongs_to :user

После этого InsurancePolicy.last.product.user должен заработать.

Обновлять:

Не существует ассоциации belongs_to through, которую можно было бы использовать для прямого доступа к модели User из InsurancePolicy. Чтобы заставить InsurancePolicy.last.user работать, просто определите эту ассоциацию как метод InsurancePolicy:

def user
  product.user
end

извините, извините, я забыл ассоциацию в переполнении стека, а не в моем коде. Я удалил нерелевантные строки и, к сожалению, строку own_to. Все еще не работает

AlbertMunichMar 28.10.2018 00:19

Что именно не работает? InsurancePolicy.last.product.user? Или InsurancePolicy.last.user?

Ilya Konyukhov 28.10.2018 00:25

Я старался избежать именно решения вашего ответа. Как вы видите в моем вопросе, я не хотел использовать для этого метод, поскольку в документации объясняется, как это сделать, но, к сожалению, он не работает.

AlbertMunichMar 28.10.2018 11:07

Как вы можете видеть в моем вопросе, то, что точно не работает, - это InsurancePolicy.last.user, и я также показал ошибку

AlbertMunichMar 28.10.2018 11:08

Другие вопросы по теме