更新我的模型的新记录的方法

时间:2011-10-27 14:02:47

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个名为UserPrice的模型,其中有一个表单,您可以一次创建多个UserPrice's。我有一个名为:all_dates的虚拟属性,它假设更新我的UserPrice模型的另一个date_select字段:purchase_date,但由于它没有正确地完成其工作,我需要对此进行详细说明方法在这里我可以让它工作:

def save_all_dates_to_user_prices
 if !self.all_dates.nil?
 self.user_prices.each {|up| up.purchase_date = self.all_dates if up.new_record?}
 end
end

我会开始:

  1. 我定义了方法save_all_dates_to_user_prices 我的UserPrice模型中的before_save

  2. if !self.all_dates.nil?表示正在检查UserPrice.all_dates属性是否为空(nil?)。

  3. 这是我迷路的地方;不确定这一行:

    self.user_prices.each {|up| up.purchase_date = self.all_dates if up.new_record?}
    
    • 它包装每个UserPrice.user_prices?如果我想要获得一系列新记录,它看起来不会是这样吗?
    • 为什么使用|up|self.user_prices.each代表什么?
    • self.user_prices.each =包裹在{}(哈希)中的任何内容?

    在回答上面提到的问题时,有人可以填写/更正有关此方法的详细信息吗?

    谢谢,我是Rails和Ruby的新手,试图在编写代码时学习。

2 个答案:

答案 0 :(得分:3)

eachEnumerable类的一种方法,Array和Hash都实现了该方法。它将一个块作为参数,并将其简单地应用于Enumerable的所有元素。所以你要问的那句话翻译成这样:

user_prices的每一个,如果是all_dates

,请将purchase_date分配给user_price

up只是一个引用当前Enumerale元素的变量。

这是good explanation of closures in ruby

答案 1 :(得分:2)

这是一段笨拙的Ruby代码,所以这里有一个细分,稍作重写:

def save_all_dates_to_user_prices
  # If all_dates is defined...
  if (self.all_dates)
    # ...then for each entry in user_prices hereby called 'up'...
    self.user_prices.each do |up|
      # ...check if this is a new record...
      if (up.new_record?)
         # ...and assign the purchase_date
         up.purchase_date = self.all_dates
      end
    end
  end
end

如果您熟悉JavaScript,那么Ruby中的x.each { |y| ... }与使用jQuery的JavaScript中的x.each(function(y) { ... })类似。垂直条内的变量表示两种情况下该功能块的参数。