Рельсы Принадлежит включает в себя ассоциации второго порядка, не признаваемые - PullRequest
0 голосов
/ 27 октября 2018

У меня есть 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.

1 Ответ

0 голосов
/ 27 октября 2018

Вызов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...