2017-05-08 13 views
2

Rails 5では、Authorモデルの新しいインスタンスを作成したいが、このプロセスでは、Userモデルから属性値(列)のサブセットのみをコピーしたい。Rails ActiveRecordオブジェクトから特定の属性のみを抽出(コピー)するにはどうすればよいですか?

私は、次のコードを実行しようとしています:User.firstメソッドが動作し、テーブルから有効なユーザーを返す

user = User.first 
Author.create user.attributes.without("id", "token", "secret", "created_at", "updated_at", "active", "email", "encrypted_password", "first_name", "last_name", "reset_password_token", "reset_password_sent_at", "remember_created_at", "sign_in_count", "current_sign_in_at", "last_sign_in_at", "current_sign_in_ip", "last_sign_in_ip") 

を。ただし、Author.create行は機能しません。私はNoMethodErrorを取得しています:未定義のメソッド `each 'はnil:NilClassエラーです。

create_table "users", force: :cascade do |t| 
    t.string "provider",        null: false 
    t.string "uid",         null: false 
    t.string "name" 
    t.string "location" 
    t.string "image_url" 
    t.string "url" 
    t.string "token" 
    t.string "secret" 
    t.datetime "created_at",        null: false 
    t.datetime "updated_at",        null: false 
    t.boolean "active",     default: false 
    t.text  "description" 
    t.string "screen_name" 
    t.integer "followers" 
    t.integer "following" 
    t.integer "statuses" 
    t.integer "listed" 
    t.integer "lists" 
    t.integer "favorites" 
    t.integer "views",     default: 0 
    t.string "website" 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "first_name",    default: "", null: false 
    t.string "last_name",    default: "", null: false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0,  null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.inet  "current_sign_in_ip" 
    t.inet  "last_sign_in_ip" 
    t.index ["active"], name: "index_users_on_active", using: :btree 
    t.index ["email"], name: "index_users_on_email", unique: true, using: :btree 
    t.index ["provider", "uid"], name: "index_users_on_provider_and_uid", unique: true, using: :btree 
    t.index ["provider"], name: "index_users_on_provider", using: :btree 
    t.index ["uid"], name: "index_users_on_uid", using: :btree 
end 

そして、ここに私の著者テーブルです:ここで

はschema.rbファイルから私のUserテーブルがある

create_table "authors", force: :cascade do |t| 
    t.string "uid",      null: false 
    t.string "provider",    null: false 
    t.string "name" 
    t.string "location" 
    t.string "image_url" 
    t.string "url" 
    t.text  "description" 
    t.string "screen_name" 
    t.integer "followers", default: 0 
    t.integer "following", default: 0 
    t.integer "statuses", default: 0 
    t.integer "listed",  default: 0 
    t.integer "lists",  default: 0 
    t.integer "favorites", default: 0 
    t.integer "views",  default: 0 
    t.string "website" 
    t.datetime "created_at",    null: false 
    t.datetime "updated_at",    null: false 
    t.index ["provider"], name: "index_authors_on_provider", using: :btree 
    t.index ["uid", "provider"], name: "index_authors_on_uid_and_provider", unique: true, using: :btree 
    t.index ["uid"], name: "index_authors_on_uid", using: :btree 
end 

あなたが見ることができるように、新しい著者テーブルには、多くのを持っていますUserテーブルと同じ列/属性が必要ですが、新しいAuthorオブジェクトを作成するときに、User属性(列と値)のサブセットをコピーするだけです。

user.attributes.withoutメソッドが適切でない可能性がありますか?

答えて

1

sliceで行うことができます。user.attributesは単なる値のハッシュです。

user.attributes.slice('name', 'location') 
+0

これは機能します、ありがとうございます! –

関連する問題