前提
言語等 | バージョン |
---|---|
Ruby | 3.1.3 |
Rails | 7.0.4 |
ActiveRecord | 7.0.4 |
DB | Postgres 14.6 |
事象
Rails7のActiveRecordを使用してモデルを作成しました。
そのクラスに対して、newやcreateメソッド引数に値を渡しても反映されない。
インスタンス生成後に、各項目に代入することは可能だった。
ruby
1[2] pry(main)> Sample.new(url: '1', counter: 20) 2=> #<Sample:0x00007fbbcdf95e30 id: nil, url: nil, counter: 0, created_at: nil, updated_at: nil>
確認したいこと
- この事象の原因
該当のソースコード
- app/models/sample.rb
ruby
1# frozen_string_literal: true 2 3class Sample < ApplicationRecord 4 attr_accessor :url, :counter 5 6 validates :url, presence: true, uniqueness: true 7 validates :counter, presence: true 8end
- app/models/application_record.rb
- 特に変更は加えていない
ruby
1# frozen_string_literal: true 2 3class ApplicationRecord < ActiveRecord::Base 4 primary_abstract_class 5end
- db/schema.rb
ruby
1ActiveRecord::Schema[7.0].define(version: 2023_01_02_130059) do 2 # These are extensions that must be enabled in order to support this database 3 enable_extension "plpgsql" 4 5 create_table "samples", force: :cascade do |t| 6 t.string "url", null: false, comment: "URL" 7 t.integer "counter", default: 0, null: false, comment: "カウンタ" 8 t.datetime "created_at", null: false 9 t.datetime "updated_at", null: false 10 t.index ["url"], name: "index_samples_on_url", unique: true 11 end 12 13end
試したこと
- createメソッドに引数として渡した→反映されず
ruby
1[1] pry(main)>Sample.create(url: '1', counter: 10) 2 TRANSACTION (0.3ms) BEGIN 3 Sample Exists? (0.6ms) SELECT 1 AS one FROM "samples" WHERE "samples"."url" = $1 LIMIT $2 [["url", "1"], ["LIMIT", 1]] 4 Sample Create (0.8ms) INSERT INTO "samples" ("url", "counter", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["url", nil], ["counter", 0], ["created_at", "2023-01-02 13:53:57.794657"], ["updated_at", "2023-01-02 13:53:57.794657"]] 5 TRANSACTION (0.3ms) ROLLBACK 6ActiveRecord::NotNullViolation: PG::NotNullViolation: ERROR: null value in column "url" of relation "samples" violates not-null constraint 7DETAIL: Failing row contains (10, null, 0, 2023-01-02 13:53:57.794657, 2023-01-02 13:53:57.794657). 8 9from /usr/local/bundle/gems/activerecord-7.0.4/lib/active_record/connection_adapters/postgresql_adapter.rb:768:in `exec_params' 10Caused by PG::NotNullViolation: ERROR: null value in column "url" of relation "samples" violates not-null constraint 11DETAIL: Failing row contains (10, null, 0, 2023-01-02 13:53:57.794657, 2023-01-02 13:53:57.794657).
- newメソッドに引数として渡した→反映されず
ruby
1[2] pry(main)> Sample.new(url: '1', counter: 20) 2=> #<Sample:0x00007fbbcdf95e30 id: nil, url: nil, counter: 0, created_at: nil, updated_at: nil>
- インスタンスを生成後、各項目に代入した→反映された
ruby
1[5] pry(main)> ins = Sample.new 2=> #<Sample:0x00007fbbcd888408 id: nil, url: nil, counter: 0, created_at: nil, updated_at: nil> 3[6] pry(main)> ins.url = 'sample' 4=> "sample" 5[7] pry(main)> ins.counter = 10 6=> 10 7[8] pry(main)> ins 8=> #<Sample:0x00007fbbcd888408 id: nil, url: nil, counter: 0, created_at: nil, updated_at: nil> 9[9] pry(main)>
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/01/03 04:43 編集