2012-05-24 8 views
0

: 지연 저장 (예 : m.delay_save!)을위한 모델 인스턴스를 표시하고 한 번 호출 (예 : DelaysManager.commit!)하여 모든 저장된 모델을 저장하는 표준 레일 기능이 있습니까?ActiveRecord에서 지연 저장

는 장황하게 :

은 사용 사례를 고려 내가 두 가지 방법으로 모델 X의 인스턴스를 갱신해야합니다

def f1 
    x = get_instance_of_x 
    x.a = 'A' 
    x.save! 
end 

def f2 
    x = get_instance_of_x 
    x.b = 'B' 
    x.save! 
end 
... 
def g 
    f1 
    f2 
end 

문제는 여기에 g 두 번 X의 인스턴스를 절약 할 수 있다는 것입니다. 그리고 나는 그것을 한 번하고 싶다. save!의 호출을 g 메소드로 이동할 수 있지만, 더 복잡한 경우 g는 저장할 오브젝트를 모를 수도 있습니다. 그래서 이것을 대신 다음과 같이 표시하고 싶습니다.

def f1 
    x = get_instance_of_x 
    x.a = 'A' 
    x.delay :save! 
end 

def f2 
    x = get_instance_of_x 
    x.b = 'B' 
    x.delay :save! 
end 
... 
def g 
    f1 
    f2 
    DelaysManager.commit 
end 

class ActiveRecord::Base 
    def delay(*args) 
    DelaysManager.delay(self, *args) 
    end 
end 

class DelaysManager 
    @@delays = [] 
    def self.delay(*args) 
    @@delays << args 
    end 

    def self.commit 
    @@delays.each { |object, *args| object.public_send(*args) } 
    @@delays.clear 
    end 
end 

답변

0

수정 된 개체를 배열로 수집하여이를 해결할 수 있습니다. 그런 다음 모두 저장하면됩니다. 물론 이미 수정 된 객체의 인스턴스를 가져올 때는 해당 객체가 배열에 있는지 확인해야합니다.

def f1 
    x = get_instance_of_x(params) 
    x.a = 'A' 
end 

def f2 
    x = get_instance_of_x(params) 
    x.b = 'B' 
end 
... 
def g 
    @array_of_x = [] 
    f1 
    f2 
    commit 
end 

def get_instance_of_x(params) 
    x = @array_of_x.select{|a| a.id == params[:id]} || X.find(params) 
    @array_of_x << x unless @array_of_x.include(x) 
    x 
end 

def commit 
    @array_of_x.each(&:save) 
end 

물론 x = @array_of_x.select{|a| a.id == params[:id]} || X.find(params) 행을 필요에 맞게 사용자 정의해야합니다.

+0

샘플 구현 아이디어는 정확하게 배열 유지 관리를 자동화하는 것입니다. – Alexey

+0

개체가 배열에 포함 된 횟수만큼 개체를 저장합니다. ActiveRecord 덕분에 변경 사항 만 저장되지만 같은 속성을 다른 곳에 겹쳐 쓰고 저장하기 전에 다른 곳을 검사하면 문제가 발생할 수 있습니다. 물론, 그것은 많은 데이터베이스 사용을 의미합니다. Mine은 조금 더 압축하고 저장하기 전에 변경된 값을 사용할 수 있습니다. 구현에 만족하면 귀하의 질문을 이해하지 못합니다. – Matzi