0

多くのサーバーで問題なく実行されるレガシーレール(バージョン1.2.3)アプリがあります(ローカル環境は言うまでもありません)。ただし、最新のサーバーにデプロイすると、ActiveRecord::StatementInvalid: Mysql::Error: #23000Column 'video_id' cannot be nullエラーが発生します。

以下は、単純化されたモデル/関係です。

class Video < ActiveRecord::Base
    has_one(:user, :dependent => :destroy)
end

class User < ActiveRecord::Base
    belongs_to(:video)
end

以下は、失敗した関係の Rails コンソールのトランスクリプトです。

>> video = Video.create(:title => 'New Video')
=> #<Video:0xb6d5e31c>...
>> video.id
=> 5
>> video.user = User.create(:name => 'Tester')
ActiveRecord::StatementInvalid: Mysql::Error: #23000Column 'video_id' cannot be null: INSERT INTO users (`name`, `video_id`) VALUES('Tester', NULL)
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract_adapter.rb:128:in `log'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/mysql_adapter.rb:243:in `execute'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/mysql_adapter.rb:253:in `insert'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1811:in `create_without_callbacks'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/callbacks.rb:254:in `create_without_timestamps'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/timestamp.rb:39:in `create'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1789:in `create_or_update_without_callbacks'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/callbacks.rb:242:in `create_or_update'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1545:in `save_without_validation'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/validations.rb:752:in `save_without_transactions'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/transactions.rb:129:in `save'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract/database_statements.rb:59:in `transaction'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/transactions.rb:95:in `transaction'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/transactions.rb:121:in `transaction'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/transactions.rb:129:in `save'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:451:in `create'
    from (irb):3
    from :0

ActiveRecord が ID を明確に認識しているのに ID を送信しないことに遭遇した人はいますか?

4

2 に答える 2

2

正しい構文は次のとおりです。

video.user.create(:name => 'Tester')

あなたが持っているように、評価のRubyの順序ごとに、video.userに割り当てる前にユーザーを作成しようとしています。

于 2010-04-21T21:18:40.460 に答える
0

さて、私はこの老朽化したアプリのこの特定の部分を Rails 2.3.5 に移行しました。次のようにしてうまくいきます。

video.create_user(:name => 'Tester')

これまでの入力に感謝しますが、コードの 1.2.3 バージョンが今日までに遭遇したすべてのサーバーで機能する理由を誰かが知っている場合 (古い ActiveRecord は特定のバージョンの MySQL とあいまいな方法で意見が一致しないのでしょうか?)ぜひ聞いてください。

于 2010-04-22T01:23:29.913 に答える