【问题标题】:Ruby on Rails has_one Model Not Supplying ID ColumnRuby on Rails has_one 模型不提供 ID 列
【发布时间】:2023-03-26 21:09:01
【问题描述】:

我有一个旧版 Rails(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 的情况?

【问题讨论】:

    标签: mysql ruby-on-rails activerecord has-one


    【解决方案1】:

    正确的语法是

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

    正如你所拥有的,它会尝试在将其分配给 video.user 之前创建用户,按照 ruby​​ 的评估顺序。

    【讨论】:

    • 或者...video.user = User.create(:name =&gt; 'Tester', :video_id =&gt; video.id)。原因是您在视频之外创建用户模型并明确设置它。在这种情况下,Rails 不会介入并施展魔法,因为您是在自己做事。为避免这种情况,请使用上述方法。
    • 不过,这是一个旧应用程序,我的语法在许多地方都在使用,没有任何抱怨。试一试新语法会产生: NoMethodError: 你有一个 nil 对象,但你没想到它!您可能期望 ActiveRecord::Base 的实例。评估 nil.create from (irb):3 from :0 时发生错误
    • 对不起,你是对的。我忘记了 User.create 如果无法保存它会返回记录。
    【解决方案2】:

    好吧,我已经将这个老应用程序的这个特定部分迁移到了 rails 2.3.5,现在下面的方法可以解决问题:

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

    到目前为止,感谢您的输入,但如果有人知道为什么 1.2.3 版本的代码可以在它遇到的每台服务器上运行,直到今天(旧的 ActiveRecord 以某种模糊的方式不同意某个版本的 MySQL,也许? ) 我很想听。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 2020-04-23
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多