Rails update_attributes для конкретной ассоциированной модели

У меня есть следующие настройки:

class Post < ApplicationRecord
  has_many :comments, inverse_of: :post, dependent: :destroy
  accepts_nested_attributes_for :comments
end

class Comment < ApplicationRecord
  belongs_to :post
end

Если я позвоню post.update_attributes(post_params)

куда post_params является следующим:

post_params = {
  "content"=>"Post something",
  "comments_attributes"=>{
    "0"=>{
      "content"=>"comment on something"
    }
  }
}

Комментарий Новый комментарий создается и связывается с постом.

Есть ли способ обновить update_attributes к сообщению и при этом обновить конкретный комментарий, связанный с сообщением?

Может быть что-то вроде:

post_params = {
  "content"=>"Post something",
  "comments_attributes"=>{
    "0"=>{
      "id"=>"1", #if the id exist update that comment, if not then add a new comment.
      "content"=>"comment on something"
    }
  }
}

Тогда я могу позвонить post.update_attributes(post_params) и воспользоваться accepts_nested_attributes_for на обновлениях.

Если это невозможно, каков наилучший способ обновления сообщения с обновлением соответствующего комментария?

Любая помощь будет принята с благодарностью.

1 ответ

Решение

Вы можете обновить предоставленные записи, если вы поддерживаете правильный идентификатор модели для модели.

Так что если post имеет comments с идентификаторами 4,5,6 вы можете отправить:

post.update(comments_attributes: [{id: 4, content: 'bob'}]

И это обновит существующие Comments.find(4) запись (при условии, что она успешно проходит проверку).

Но если вы передадите идентификационный номер, который не применяется к комментариям, относящимся к этому сообщению, будет выдано исключение.

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