Ruby on Rails has_one Модель, не поддерживающая столбец идентификаторов
У меня есть устаревшее приложение 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
И ниже транскрипт рельсовой консоли об ошибках связи:
>> 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, когда он это ясно знает?
2 ответа
Правильный синтаксис
video.user.create(:name => 'Tester')
как он у вас есть, он пытается создать пользователя перед тем, как назначить его на video.user, в порядке оценки ruby.
Ну, я перенес эту конкретную часть этого старого приложения на рельсы 2.3.5, и вот что теперь помогает:
video.create_user(:name => 'Tester')
Спасибо за вклад до сих пор, но если у кого-то есть идея, почему версия кода 1.2.3 работает на каждом сервере, с которым он встречался до сегодняшнего дня (более старый ActiveRecord не соглашался с определенной версией MySQL каким-то неясным способом, может быть?) Я ' Я хотел бы услышать это.