Rails 3.0.11에서 3.1.3으로 변경된 이후로 이상한 오류가 발생했습니다. 다음은 오류를 재현 할 수있는 독립 실행 형 코드입니다 :has_many 연관에 대한 find_or_initialize_by가 중복 오류를 발생합니다.
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => 'mysql2',
:username => 'root',
:database => "some_development"
)
class User < ActiveRecord::Base
has_many :favorites
end
class Favorite < ActiveRecord::Base
belongs_to :user
end
u = User.create
# f = u.favorites.find_or_create_by_site_id(123) #=> pass
f = u.favorites.find_or_initialize_by_site_id(123) #=> fail
f.some_attr = 'foo'
f.save!
u.name = 'bar'
u.save! # ActiveRecord::RecordNotUnique will be thrown here!
favorites
테이블에 INSERT
에 같은 기록을 시도 ActiveRecord::RecordNotUnique
을 종료합니다. (이 예에서는 (user_id, site_id) 쌍이 즐겨 찾기에서 고유해야 함).
흥미롭게도 find_or_initialize
대신 find_or_create
을 사용하면 예외가 발생하지 않습니다.
autosave_association
이 호출 된 스택 추적에서 이유를 모르지만 실제로는 has_many :favorites
대신 has_many :favorites, :autosave => false
이 오류를 제거합니다. autosave
에 대해 전혀 신경 쓰지 않았으므로, :autosave => false
이 좋은 아이디어인지 확실하지 않습니다.
내가 뭘 잘못하고 있니? 아니면 레일즈 버그 야? 누구든지 나를 볼 포인터를 줄 수 있습니까?
합니까 사용자 모델을 볼 수는 필드의 고유성에 대한 유효성 검사가? 또한 그것의 옆에'# => pass'로 주석 처리 된 행은 무엇입니까? 한번에 두 가지 버전의 즐겨 찾기를 만들려고하십니까? – Batkins
예, User 모델에는 고유성을 비롯한 일련의 유효성 검사가 있지만 관련성이 확실하지 않습니다. find_or_initialize 대신 find_or_create 행에 주석 처리하면 내 질문에 설명 된대로 오류없이 전달됩니다. – kenn
이것을 시도해 볼 수 있습니까?'u.save! '대신'u.save'를 실행 한 다음'puts u.errors' 또는'p u.errors'를 수행하십시오. 오류는 무엇입니까? 나는 이것이 유일성에 대한 검증 중 하나를 통과시키지 않는 사용자를 생성하는 문제라고 생각한다. 왜냐하면 (사용자가 속성을 입력하지 않고 일반'User.create'를 사용하기 때문에). – Batkins