Не могу получить доступ к реквизиту в отношениях has_one - PullRequest
1 голос
/ 25 октября 2019

У меня есть две модели:

class Post < ApplicationRecord
  has_one :metric, dependent: :destroy
end

class Metric < ApplicationRecord
  belongs_to :post
end

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

> post = Post.first 1
> post.metric # => Nil
> post.metric.create # NoMethodError (undefined method `create' for nil:NilClass)

Должен ли я объявить что-либо еще из моих моделей, чтобы это работало?

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Вы не можете вызвать метод создания для nil класса.

Ассоциации активных записей DOC

post = Post.first 1
post.build_metric # will be automatically assigned post_id to metrics but not saved
post.save
#or
post.create_metric # will be automatically assigned post_id to metrics and saved

Альтернативное решение:

Metric.create(post_id: post.id)

0 голосов
/ 25 октября 2019

То, что вы делаете, это

post = Post.first 1
# You don't tell us what this evaluates to, but I'm assuming a post as the #metric call works

post.metric # => Nil
# You have nil

post.metric.create
# Now you're calling the create method on nil. 

Что вам нужно сделать, это

Metric.create(post_id: Post.first.id, etc_attribute: etc_value, ...) 

РЕДАКТИРОВАТЬ: Кроме того, 7urkm3n сказал в своем комментарии - build_metric и create_metric - более чистые решениякоторые используют магию рельсов.

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