【发布时间】:2013-11-28 14:24:52
【问题描述】:
我正在使用 Ruby on Rails 4,我想通过update_attributes 方法正确处理关联记录的更新和创建过程。也就是说,我有以下内容:
# Model
class Article < ActiveRecord::Base
has_many :categories
accepts_nested_attributes_for :categories
end
# Controller
class ArticlesController < ApplicationController
def update
@article = Article.find(params[:id])
@article.update_attributes(update_params)
...
end
private
def update_params
params.require(:article).permit(:title, ..., :categories_attributes => [:name, ...])
end
end
# Logger for the update request
Started PATCH "/articles/6"
Processing by ArticlesController#update
Parameters: {"utf8"=>"✓", "article"=>{"title"=>"Sample title", "categories_attributes"=>{"0"=>{"name"=>"Sample Category 1", "..."=>"..."}, "1"=>{"name"=>"Sample Category 2", "..."=>"..."}, : "..." => {...}}
...
问题与 Rails 处理更新数据库中关联记录的方式有关,在我的情况下,当通过 @article 对象更新类别时:提交数据以触发 update 操作并传递参数到update_attributes 方法(如上面的记录器中所示),然后Rails 在数据库中创建新的类别记录,为散列categories_attributes 中存在的每个元素创建一个。
但是,我的意图是更新现有的类别记录(如果存在),或者创建新的记录(如果不存在),根据 @987654330 中 article_id 和 name 列的唯一性@ 数据库表,可能会搜索这些列中存在的数据,以检查是否需要更新或创建新记录。实际上,在“编辑文章”视图中,我显示了一个表单,其中包含用于编辑类别的输入字段,包括预先填充了与现有类别相关的数据的字段以及可以由编辑器用户“动态”创建的类别的空字段。
如何正确处理这种行为?是模型还是控制器的责任?或者,也许有更好的方法直接在“编辑文章”视图中管理类别?
【问题讨论】:
-
@karlingen - 我应该在哪里尝试运行该方法?在模型或控制器中?
-
@karlingen - 我以多种方式尝试了“first_or_create”,也许这不是我可以用来解决问题的 ritgh 方法...
标签: ruby-on-rails ruby activerecord model controller