本日3.2.7からRails3.2.9にアップグレードし、メソッド「to_i」がActiveRecordから削除されたようです。
これは仕様によるものですか?それともバグですか?変更ノートにそれについての言及が見つかりません。これは多くのコードに影響を与えます。
ありがとう!
本日3.2.7からRails3.2.9にアップグレードし、メソッド「to_i」がActiveRecordから削除されたようです。
これは仕様によるものですか?それともバグですか?変更ノートにそれについての言及が見つかりません。これは多くのコードに影響を与えます。
ありがとう!
この#to_i
メソッドは存在しませんでしたが、オブジェクトを値に割り当てる方法がRails3.2.8で変更されました。
次の場合:
class Lecture < ActiveRecord::Base
has_one :professor
end
以前は、次のような講義に教授を割り当てることができました。
@lecture.professor = Professor.find_by_id(1)
またはこのように:
@lecture.professor_id = Professor.find_by_id(1)
professor
最初のケースでは、関連付けが教授オブジェクトを期待しているため、すべてが単純です。professor_id
2番目のケースでは、ActiveRecordは、代わりに整数を期待するように、教授からIDを強制するためにいくつかの魔法を実行しました。
Rails 3.2.8以降では、その魔法は機能しなくなりました。それはあなたがおそらく何か間違ったことをしているというヒントであるため、ある意味で素晴らしいです。たとえばprofessor_id
、データベースに列がなくprofessor
、整数を期待する列がある場合、このような割り当ては機能しなくなります。
これは、Rails3.2.11の以前の動作に戻るようです。
同じエラーが発生しました。ActiveRecordに#to_iがないわけではありませんが、私の場合はfactory_girlgemが関係しています。
factory_girl (4.1.0)
factory_girl_rails (4.1.0)
違いの孤立したケースは次のとおりです。
rails _3.1.0_ new rails31
cd rails31
bundle install
rails g scaffold note title:string contents:text
rails g scaffold user name:string
rails g migration add_user_id_to_notes user_id:integer
rake db:migrate
次に、コンソールで:
require 'factory_girl'
FactoryGirl.define { factory :note }
Factory(:note, :user_id => User.first, :title => 'foo')
User Load (0.1ms) SELECT "users".* FROM "users" LIMIT 1
SQL (0.5ms) INSERT INTO "notes" ("contents", "created_at", "title", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?) [["contents", nil], ["created_at", Sun, 13 Jan 2013 21:29:36 UTC +00:00], ["title", "foo"], ["updated_at", Sun, 13 Jan 2013 21:29:36 UTC +00:00], ["user_id", 1]]
=> #<Note id: 3, title: "foo", contents: nil, created_at: "2013-01-13 21:29:36", updated_at: "2013-01-13 21:29:36", user_id: 1>
ただし、次の手順で同じ手順を実行すると、次のようになります。
rails _3.2.11_ new rails3211
次に、コンソールに次のように表示されます。
1.9.2-p290 :001 > require 'factory_girl'
=> true
1.9.2-p290 :002 > FactoryGirl.define { factory :note }
=> []
1.9.2-p290 :003 > Factory(:note, :user_id => User.first, :title => 'foo')
User Load (0.1ms) SELECT "users".* FROM "users" LIMIT 1
(0.0ms) begin transaction
SQL (24.5ms) INSERT INTO "notes" ("contents", "created_at", "title", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?) [["contents", nil], ["created_at", Sun, 13 Jan 2013 21:33:03 UTC +00:00], ["title", "foo"], ["updated_at", Sun, 13 Jan 2013 21:33:03 UTC +00:00], ["user_id", nil]]
(2.4ms) commit transaction
=> #<Note id: 1, title: "foo", contents: nil, created_at: "2013-01-13 21:33:03", updated_at: "2013-01-13 21:33:03", user_id: nil>
Rails3.2.11のniluser_idに注意してください
Rails 3.2.9の「to_i」メソッドに関して1つの変更がありましたが、これはテーブルではなく列を処理します。ここを参照してください。
したがって、コードでは、列の値ではなくオブジェクト全体を渡すと、以前はサイレントに失敗していました。しかし今では、実際にはオブジェクトの「to_i」メソッドを呼び出して例外を発生させます。
Lucaをフォローアップするために、私はRails 3.2.11を使用していて、そのようなコードがあるかどうかはわかりませんが、これは機能しなくなったことがわかりました。
@lecture.update_attribute(:professor_id, Professor.find_by_id(1))
私は、to_i
メソッドが彼ら自身のARオブジェクトで利用可能であるとは思わない。以前のメソッドの使用法についてもう少し具体的に説明していただけますか?現在は失敗していますか?
ええ、私もRailsバージョン3.2.3をRails3.2.11にアップグレードしたときに同じ問題が発生しました。
ここにいくつかのコードスニペットがあります正確な問題は何ですか
レール
内3.2.3doctor= Doctor.firstpatient
= Patient.newpatient.doctor_id
= doctor(右側のオブジェクト割り当ては有効です)
patient.save!(有効)
レール内3.2.11
doctor = Doctor.firstpatient
= Patient.newpatient.doctor_id
= doctor(右側のオブジェクト割り当ては無効です)
patient.save!(無効)
NoMethodError:未定義のメソッド'to_i'エラーこの種の割り当てを取得しました。
結論は、オブジェクトの割り当てとは異なり、_ID=INTEGERのみを使用することです。
詳細