rails在创建回调后增加非主ID列

时间:2013-12-28 21:40:23

标签: ruby-on-rails ruby

我正在尝试创建一个记录,并在带有整数和日期的after create回调中递增两个非主要id列。第一列需要使用从1到给定数字的整数自动递增。第二列需要增加一个指定开始日期的日期和7天,14天或30天的日期,这也是指定的。我尝试使用第一个值创建第一个记录,然后从那里递增,但所有记录都保存了相同的整数或日期。

这是代码

def create_positions
    @slots = (self.slots - 1)
    @payout_date = (self.start_date)
    @position = Position.create(:susu_id => self.id, :user_id => 2, :position_number => 1, :pay_in => self.contribution, :payout_date => (@payout_date + self.frequency_in_days.days))  
    @positions= self.positions.map { |p| p["position_number"] }.last.to_i
    @position_number = (@positions += 1)
    @dates = self.positions.map { |d| d["payout_date"] }.last
    @add_date = (@dates + self.frequency_in_days.days)
    @all_positions = @slots.times {Position.create(:susu_id => self.id, :user_id => 2, :position_number => @position_number, :pay_in => self.contribution, :payout_date => @add_date)   }
  end

我得到的是:1 2 2 2和1/2/14 1/9/14 1/9/14 1/9/14

代替:1 2 3 4和1/2/14 1/9/14 1/16/14 1/23/14

1 个答案:

答案 0 :(得分:0)

我缺乏声誉禁止我评论你的原帖,所以我只需要尽力回答你的问题而不要求澄清(因为我不完全理解你对你所尝试的内容的解释做)。

听起来你正在尝试创建四个Position实例,每个后续位置的position_number比前一个更大,并且payout_date比前一个更晚7天。

如果您正在尝试这样做,请consider the following

# in the top of your susu model:
after_create :create_positions

# later in your susu model
def create_positions     
    4.times do |n|
        Position.create(susu: self,
                        user_id: 2,
                        position_number: n,
                        pay_in: contribution, 
                        payout_date: start_date + n * frequency_in_days.days)
    end
end

你在这个方法的版本中有很多逻辑,所以如果我错过了你需要的东西,请告诉我。

最后,让我指出一些关于我的代码版本的内容:

  • 它使用Ruby 1.9哈希语法(“susu: self”而不是“:susu => self”)
  • 删除了对self的不必要的调用,该调用被视为bad ruby style
  • 它仍然有硬编码user_id: 2,这似乎你需要在某些时候改变
  • 在after_create挂钩中执行此操作将与正在创建的原始对象处于同一事务中。这意味着如果由于某种原因无法创建Position(例如,位置模型上的数据库级唯一键或validates_uniqueness_of失败),它将回滚原始对象的创建。如果您不喜欢这种行为,可以使用after_commit回调。

干杯!