2012-06-28 7 views
1

Model.create 메소드를 실행할 때 : id에 대한 값을 지정하면 나중에 무효화됩니다. 예 : 대신레일 : .create는 다음에 대한 사용자 정의 값을 무효화합니다. id

Model.create (
    :id => 50, 
    :name => Joe, 
    :enabled => yes 
) 

마지막으로 부르는 나는 .new를 사용하고 클래스 변수에 저장 한 다음 클래스 변수를 통해 내 id 값을 저장하고 할 필요는 저장 :

m = Model.new (
    :name => Joe, 
    :enabled => yes 
) 

m.id = 50 
m.save 

이 코드를 seeds.rb에서 실행하려고하는데, 이것은 매우 건조한 코드가 아닙니다. 어떻게하면 더 나은 결과를 얻을 수 있습니까?

+0

왜 그렇게해야합니까? Rails 컨벤션의 범위를 벗어나 있으므로 DRY가되지 않습니다 (Rails는 컨벤션을 나가기 위해 "처벌합니다"). – YuriAlbuquerque

+1

Rails 규칙조차도 관계형 데이터베이스 협약의 문제입니다. 논리에 특정 값을 갖는 기본 키 ('do_something if user.id == 50')에 의존하고 있다면 당신이하고있는 일을 재고 할 필요가 있습니다. –

답변

2

id는 단지 attr_protected입니다. 이를 방지하기 위해 기본 보호 속성 목록을 무시할 수 있습니다. 속성 정보가 외부에서 올 수있는 곳이면 어디에서나주의해야합니다. id 필드는 이유에 의해 기본적으로 보호됩니다.

class Model < ActiveRecord::Base 
    private 
    def attributes_protected_by_default 
     [] 
    end 
end 

또는 @Leo로 이동 대답

+0

예! 고마워, 너 오늘 나에게 뭔가 새로운 것을 가르쳐 줬어. 이것은 모든 RoR 개발자가 활용에 신중해야한다는 것입니다. –

1

답변을 드릴 수 있습니다. Model.create는 Model.new가 Model.save 다음에 당신이 ID를 변경하고 다시 저장되기 때문에 당신은뿐만 아니라 두 개의 저장하고 당신을 제거합니다

m = Model.new { 
    :name => Joe, 
    :enabled => yes 
} 
m.id = 50 
m.save! 

을 할 수 기본적으로.

+0

죄송합니다. 나는'Model.new'를 사용하고 있었지만, 나는 내 질문에 대해 복사/붙여 넣기에 너무 빠르다. 죄송합니다. 이 문제를 해결하기 위해 원래 질문을 수정했습니다. –