我是一名新手Ruby开发人员。我无法弄清楚如何使用不同于DB模式中定义的属性名称来创建ActiveRecord
模型
考虑以下架构
create_table "sync_tasks", force: :cascade do |t|
t.string "name"
t.string "path"
t.string "task_type"
t.string "status"
t.boolean "async", default: false
t.boolean "direct_download", default: true
t.datetime "created_at", null: false
t.datetime "completed_at"
t.datetime "updated_at", null: false
end
我有以下有效载荷
{
"name" : "Sync /var/www/",
"path" : "/var/www",
"directDownload": true,
"async" : false,
"taskType" : "directory"
}
尝试创建我的模型
class SyncTask < ApplicationRecord
TYPE_DB='db'
TYPE_FILE='file'
TYPE_DIRECTORY='directory'
def initialize(params)
# super
@task_type = params[:taskType]
@direct_download = params[:directDownload]
@path = params[:path]
@status = params[:status]
@async = params[:async]
end
end
当我尝试保存时会抛出错误
<NoMethodError: undefined method `[]' for nil:NilClass>
此外,我无法访问
这样的字段 new_task = SyncTask.new(allowed_task_params)
new_task.task_type
它会抛出以下错误
#<NoMethodError: undefined method `task_type' for #<SyncTask not initialized>>
如果我取消注释超级调用它会产生另一个错误
#<ActiveModel::UnknownAttributeError: unknown attribute 'taskType' for SyncTask.>
我做错了什么?如何使用不同的属性名称并自行初始化模型?
由于
答案 0 :(得分:0)
您可以transform the keys
,例如:
=> payload = { "name": "Sync /var/www/", "path": "/var/www", "directDownload": true, "taskType": "directory" }
=> h = payload.transform_keys { |key| key.to_s.underscore } # only since v4.0.2
=> h = Hash[payload.map { |(k, v)| [k.to_s.underscore, v] }] # before v.4.0.2
#> {"name"=>"Sync /var/www/", "path"=>"/var/www", "direct_download"=>true, "task_type"=>"directory"}
=> new_task = SyncTask.new(h)
您不应在AR模型上使用initialize方法。如果您仍需要使用initialize
,请使用after_initialize
挂钩。因为初始化我们必须声明超级,所以最好使用回调。