Rails循环没有完成操作

时间:2014-01-04 09:23:17

标签: ruby-on-rails ruby

我有一个奇怪的问题,我在这里有两个模型动作。一个是为新用户创建价格记录,另一个是为所有现有用户创建价格记录,如此处所示;

   def self.initialize_price(user_id)
      prices = InitialPrice.all
      prices.each do |price|
         user_price = Price.new(country: "#{price.country}", network: "#{price.network}", 
                              price_eur: price.price_eur, price_ugx: price.price_ugx, 
                              price_kes: price.price_kes, price_tzs: price.price_tzs,
                              price_usd: price.price_usd, user_id: user_id, prefix: "#{price.prefix}")
         user_price.save
      end
   end

   def self.update_user_prices      
      users = User.all
      users.each do |user|
         Price.initialize_price(user.id)
      end
   end   

但是,在控制台中调用

时的第二个操作
  

Price.update_user_prices

它只为第一个用户

创建记录
  

user_id = 1

并跳过其他人。为什么? 谢谢

1 个答案:

答案 0 :(得分:0)

就个人而言,我认为你的方法很臃肿,这可能是你犯错误的原因

查看您的代码,我会在User模型中使用after_create回调

#app/models/user.rb
Class User < ActiveRecord::Base
    after_create :initialize_price

    def initialize_price
        InitialPrice.each do |price|
            Price.create({country: price.country, network: price.network, 
                          price_eur: price.price_eur, price_ugx: price.price_ugx, 
                          price_kes: price.price_kes, price_tzs: price.price_tzs,
                          price_usd: price.price_usd, user_id: id, prefix: price.prefix})
        end
    end

end

我尽可能地尽力DRY代码。每次包含当地价格时,您基本上都在复制自己。我会通过更改价格表来处理它以处理价格或其他东西的货币汇率


更多

对您有益的事情将是instance methods & class methods

  • 实例方法在对象的实例上运行 - @user.instance_method
  • 类方法创建对象的实例 - User.class_method

<强>方法

我认为您的问题是,当我使用class methods instance method方法时,您两次都在使用initialize_price,如下所示:

   #app/models/user.rb #-> User.update_prices
   def self.update_prices      
      self.all.each do |user|
         user.initialize_price
      end
   end  

   #app/models/user.rb # -> @user = User.find(15) @user.initialize_price
   def initialize_price
      prices = InitialPrice.all
      prices.each do |price|
         user_price = Price.new(country: "#{price.country}", network: "#{price.network}", 
                              price_eur: price.price_eur, price_ugx: price.price_ugx, 
                              price_kes: price.price_kes, price_tzs: price.price_tzs,
                              price_usd: price.price_usd, user_id: user_id, prefix: "#{price.prefix}")
      end
      update_attributes(price: price)
   end