Ich bin ein Neuling Ruby-Entwickler. Ich kann nicht herausfinden, wie ein ActiveRecord
Modell mit unterschiedlichen Attributen Namen erstellen, als in einem DB-Schema definiertSo legen Sie Attribute mit anderen Namen als ein DB-Schema fest
das folgende Schema
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
und ich habe die folgende Nutzlast
{
"name" : "Sync /var/www/",
"path" : "/var/www",
"directDownload": true,
"async" : false,
"taskType" : "directory"
}
Und versuche Betrachten um mein Modell so zu erstellen
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
Wenn ich versuche, es zu speichern, einen Fehler wirft
<NoMethodError: undefined method `[]' for nil:NilClass>
auch ich nicht in der Lage bin Feld zuzugreifen, wie die
new_task = SyncTask.new(allowed_task_params)
new_task.task_type
Es führt den folgenden Fehler
#<NoMethodError: undefined method `task_type' for #<SyncTask not initialized>>
Falls ich Kommentar- der Superaufruf gibt einen anderen Fehler
#<ActiveModel::UnknownAttributeError: unknown attribute 'taskType' for SyncTask.>
Was mache ich falsch? Wie kann ich verschiedene Attributnamen verwenden und das Modell selbst initialisieren?
Dank
Es gibt keine Möglichkeit, benutzerdefinierte Initializer überhaupt bereitzustellen? Ich habe nicht erwartet, dass ein solches Verhalten von solch dynamischen Sprache wie Ruby – bxfvgekd
Es funktioniert, aber ich mag diese Lösung nicht, wirklich schlechte Funktionalität. – bxfvgekd
In diesem Fall sind Sie abhängig von Modellimplementierungsdetails und Sie können nicht verschiedene Schichten Ihrer Anwendung trennen, wirklich enttäuscht – bxfvgekd