2009-04-13 4 views
4

저는 RoR을 배우기위한 프로젝트로 약간의 브라우저 게임을 쓰고 있습니다.레일스 코드를 개선하려면 어떻게해야합니까?

이것은 정기적으로 cronjob에 의해 호출되는 작은 방법입니다.

포션 배열에 요소를 추가 한 다음 끝에 대용량 저장을 수행하는 방법이 있어야한다고 생각합니다. 루프의 매번 db를 사용하여 항목 수를 얻는 것을 좋아하지 않습니다. 다시 시장을 위해.

def self.restock_energy_potions 
    market = find_or_create_market 

    potions = EnergyPotion.find_all_by_user_id(market.id) 

    while (potions.size < 5) 
    potion = EnergyPotion.new(:user_id => market.id) 
    potion.save 
    potions = EnergyPotion.find_all_by_user_id(market.id) 
    end  
end 

답변

8

귀하의 질문을 이해하고 있는지 잘 모르겠습니다. 이런 식으로 찾으세요?

def self.restock_energy_potions 
    market = find_or_create_market 
    potions = EnergyPotion.find_all_by_user_id(market.id) 
    (potions.size...5).each {EnergyPotion.new(:user_id => market.id).save } 
    end  
end 

범위의 삼중 점에주의하십시오. 이미 묘약이 링크 된 경우 5.

또한, (has_many에 의해 예)가있는 경우 당신은 당신이 나는 사이의 관계에 대해, 여기 추측하고있어합니다 (market.potions 속성을 통해 그들을 만들 수있는 물약을 만들 싶지 않아 사용자 및 시장 - 세부 정보는 모델 설정 방법에 따라 다름) 한 번에 모두 저장할 수 있습니다. 나는 데이터베이스 절감이 중요하다고 생각하지 않는다.

+0

예,이 방법은 제가 수행 한 해결책과 비슷하지만 모든 새로운 물약을 한 번에 저장할 수있는 방법이 있습니까? 예를 들어, 필요한 추가 3을 작성한 다음 데이터베이스 호출을 하나만 수행하십시오. 아니면 그냥 마이크로 최적화하고 싶습니까? – Kirschstein

+0

@Kirchstein - 그렇습니다. belongs_to/has_many 설정과 연결하여 이러한 작업을 수행 할 수는 있지만, 저장 용량이 많다고 생각하지 않습니다. 최고로 1-5 개의 작은 INSERT INTO 대신 하나의 큰 INSERT INTO를 얻지 만, 그 효과는 측정 가능할 것입니다. – MarkusQ

0

당신의 시장/사용자 has_many 물약, 당신이 할 수 있다고 가정하면

def self.restock_energy_potions 
    market = find_or_create_market 
    (market.potions.size..5).each {market.potions.create(:user_id => market.id)} 
end 
0

가) 사용 협회 :

class Market < AR::Base 
    # * note that if you are not dealing with a legacy schema, you should 
    # rename user_id to market_id and remove the foreigh_key assignment. 
    # * dependent => :destroy is important or you'll have orphaned records 
    # in your database if you ever decide to delete some market 
    has_many :energy_potions, :foreign_key => :user_id, :dependent => :destroy 
end 

class EnergyPotion < AR::Base 
    belongs_to :market, :foreign_key => :user_id 
end 

b)는 각각 하나를 추가 한 후 연결을 다시 할 필요가 없습니다. 또한 모델로 기능 이동 :

find_or_create_market.restock 

class Market 
    def restock 
    # * note 4, not 5 here. it starts with 0 
    (market.energy_potions.size..4).each {market.energy_potions.create!} 
    end 
end 

c)를도 만들 수 있습니다! 생성하지 않습니다. 오류를 감지해야합니다. 오류 처리는 응용 프로그램에 따라 다릅니다. 당신이 cron에서 실행 한 이후에 당신이 할 수있는 일이 많습니다. * 경고를 이메일로 보내십시오. * 예외를 잡아서 기록하십시오 (exception_notifier 플러그인 또는 hoptoad 호스팅 서비스) * stderror에 인쇄하고 오류를 보내도록 cron을 구성하십시오. 어떤 이메일.

def self.restock_potions 
    market = find_or_create 
    market.restock 
    rescue ActiveRecord::RecordInvalid 
    ... 
    rescue 
    ... 
    end 
관련 문제