2010-04-21 4 views
0

내 로컬 환경은 말할 것도없이 여러 서버에서 문제없이 실행되는 레거시 레일 (버전 1.2.3) 앱이 있습니다. 최신 서버에 배포했는데 이제는 ActiveRecord::StatementInvalid: Mysql::Error: #23000Column 'video_id' cannot be null 오류가 발생합니다. 아래Ruby on Rails has_one 모델이 제공되지 않음 ID 열

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

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

그리고 실패한 관계의 레일 콘솔 성적 증명서입니다 : 아래

단순화, 모델/관계이다

다른 사람은 ID 경우를 전송하지 액티브 건너했습니다

>> 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 
그것을 분명히 알고 있습니까?

답변

2

올바른 구문은

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

당신이 그것을 가지고

, 평가의 루비 주문 당, video.user에 할당하기 전에 사용자를 만들기 위해 노력하고 있습니다. 사람이있는 경우 지금까지 입력

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

감사합니다,하지만 :

+0

또는 'video.user = User.create (: name =>'Tester ', : video_id => video.id)'. 그 이유는 비디오 외부에서 User 모델을 만들고 명시 적으로 설정하기 때문입니다. 이 경우 레일즈는 뛰어 들지 않으며 마술을하지 않습니다. 왜냐하면 여러분 스스로 일을하고 있기 때문입니다. 이것을 피하려면 위와 같이하십시오. –

+0

이것은 오래된 앱이지만 내 구문은 여러 위치에서 불만없이 사용됩니다. 새로운 구문을 사용하면 다음과 같은 결과가 나타납니다. NoMethodError : 예상치 못한 경우 객체가 없습니다! ActiveRecord :: Base의 인스턴스를 예상했을 수 있습니다. nil.create를 평가하는 중 오류가 발생했습니다. \t (irb) : 3 \t 출처 : 0 –

+0

죄송합니다. 나는 그것을 저장할 수 없다면 User.create가 레코드를 반환한다는 것을 잊었다. – mckeed

0

글쎄, 나는 2.3.5 레일이 잘 세 응용 프로그램의 특정 부분을 마이그레이션하고 이제 다음은 트릭을 수행 한 왜 1.2.3 버전의 코드가 오늘까지 만난 모든 서버에서 작동하는지 (이전 버전의 ActiveRecord는 특정 버전의 MySQL과 일부 모호한 방식으로 의견이 다를 수 있습니다.) 나는 그것을 듣고 싶습니다.