dimanche 17 septembre 2017

How to set attributes with different names than a DB schema

I am a newbie Ruby developer. I cannot figure out how to create an ActiveRecord model with different attributes names than defined in a DB schema

Consider the following 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

And I have the following payload

{
    "name" : "Sync /var/www/",
    "path" : "/var/www",
    "directDownload": true,
    "async" : false,
    "taskType" : "directory"
}

And trying to create my model like that

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

When I try to save it throws an error

<NoMethodError: undefined method `[]' for nil:NilClass>

Also I am not able to access field like that

  new_task = SyncTask.new(allowed_task_params)
  new_task.task_type

It throws the following error

#<NoMethodError: undefined method `task_type' for #<SyncTask not initialized>>

In case I uncomment the super call it gives another error

#<ActiveModel::UnknownAttributeError: unknown attribute 'taskType' for SyncTask.>

What I am doing wrong ? How can I use different attributes names and initialize the model by myself ?

Thanks

Aucun commentaire:

Enregistrer un commentaire