新手问题 关于 rails 中 create_table 函数功能的具体实现

twivil · 2013年10月16日 · 最后由 jjym 回复于 2013年10月16日 · 3416 次阅读

创建数据库表的时候常常看到这样的代码

def self.up
  create_table :products do |f|
     t.string :title 
     t.text :decription
     ...........

     end
end

但是看 rails 的源码,我并没有在 create_table 的函数里面看到有 yield

[:create_table, :create_join_table, :rename_table, :add_column, :remove_column,:rename_index, :rename_column, :add_index, :remove_index, :add_timestamps, :remove_timestamps,:change_column_default, :add_reference, :remove_reference, :transaction,:drop_join_table, :drop_table, :execute_block, :enable_extension,:change_column, :execute, :remove_columns, # irreversible methods need to be here too
      ].each do |method|
        class_eval <<-EOV, __FILE__, __LINE__ + 1
          def #{method}(*args, &block)          
            record(:"#{method}", args, &block)  
          end                                   
        EOV
      end


def record(*command, &block)
        if @reverting
          @commands << inverse_of(*command, &block)
        else
          @commands << (command << block)
        end
      end

根据我的理解,代码块不是单独存在的,她出现在一个函数调用之后,如果这个函数不是迭代器,也没有 yield 来调用其后的代码,那么这个代码块会被忽略。但是她却没有被忽略。到底是什么原因呢?谢谢

不一定通过 yield 调用,ruby 语法推荐《ruby 编程语言》

2 楼 已删除

#1 楼 @jjym 我就是看得这本书,她上面的确是这么说的。

#3 楼 @twivil 可能你没看完吧,建议你看完语法后再去看源码

需要 登录 后方可回复, 如果你还没有账号请 注册新账号