7

本日3.2.7からRails3.2.9にアップグレードし、メソッド「to_i」がActiveRecordから削除されたようです。

これは仕様によるものですか?それともバグですか?変更ノートにそれについての言及が見つかりません。これは多くのコードに影響を与えます。

ありがとう!

4

6 に答える 6

4

この#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_id2番目のケースでは、ActiveRecordは、代わりに整数を期待するように、教授からIDを強制するためにいくつかの魔法を実行しました。

Rails 3.2.8以降では、その魔法は機能しなくなりました。それはあなたがおそらく何か間違ったことをしているというヒントであるため、ある意味で素晴らしいです。たとえばprofessor_id、データベースに列がなくprofessor、整数を期待する列がある場合、このような割り当ては機能しなくなります。

これは、Rails3.2.11の以前の動作に戻るようです。

于 2013-01-07T17:37:00.977 に答える
2

同じエラーが発生しました。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に注意してください

于 2013-01-13T21:38:01.367 に答える
2

Rails 3.2.9の「to_i」メソッドに関して1つの変更がありましたが、これはテーブルではなく列を処理します。ここを参照してください。

したがって、コードでは、列の値ではなくオブジェクト全体を渡すと、以前はサイレントに失敗していました。しかし今では、実際にはオブジェクトの「to_i」メソッドを呼び出して例外を発生させます。

于 2012-12-04T23:10:08.497 に答える
0

Lucaをフォローアップするために、私はRails 3.2.11を使用していて、そのようなコードがあるかどうかはわかりませんが、これは機能しなくなったことがわかりました。

@lecture.update_attribute(:professor_id, Professor.find_by_id(1))
于 2013-01-09T11:54:03.687 に答える
0

私は、to_iメソッドが彼ら自身のARオブジェクトで利用可能であるとは思わない。以前のメソッドの使用法についてもう少し具体的に説明していただけますか?現在は失敗していますか?

于 2012-12-01T20:23:48.210 に答える
0

ええ、私も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のみを使用することです。
詳細

于 2013-01-21T16:18:51.853 に答える