У меня есть 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.
Извините, я не писал это в моем stackoverflow, да в моем коде
Вызов 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. Все еще не работает
Что именно не работает? InsurancePolicy.last.product.user
? Или InsurancePolicy.last.user
?
Я старался избежать именно решения вашего ответа. Как вы видите в моем вопросе, я не хотел использовать для этого метод, поскольку в документации объясняется, как это сделать, но, к сожалению, он не работает.
Как вы можете видеть в моем вопросе, то, что точно не работает, - это InsurancePolicy.last.user, и я также показал ошибку
Думаю, вам не хватает
belongs_to :user
в моделиProduct