Apr 02

ActiveScaffoldExt之一:batch_create

Tag: activescaffold, enterprise, plugincaoweiyuan @ 5:21 pm

批量创建(batch_create)是我们从项目中抽象出来的第一个ActiveScaffoldExt,用以在一个表单中批量创建很多记录。

简介

假设我们有一个ActiveRecord的模型叫做Sneaker(运动鞋),有这么几个属性:品牌、尺寸、颜色,当然还有名称。品牌可能是Adidas、Nike或者别的,尺寸假设是7、8和9(英寸),颜色包括红蓝白。如果我们需要把这个排列组合里的每个情况都加入sneakers表,而又不想输入2×3x3次创建表单,那么你就需要用到这个批量创建功能。在我们编程提出DRY的口号的同时,我们软件的客户也同样希望不要做重复的机械性操作。在我们的项目中,有多个模型需要用到批量创建,比如物料列表,货架编号等等。有关实现这个功能的核心算法,我们已经在javaeye的一篇帖子中讨论过了。

安装

将activescaffold-ext安装到你项目的插件中,安装插件有很多方法,我们建议用svn propedit svn:externals vendor/plugins的方法,这样可以通过svn update保持与我们的开发同步,svn repository的地址是:http://activescaffold-ext.googlecode.com/svn/trunk/。然后,你还需要将frontends/ext/目录中的所有文件copy(或者merge)到你的app/views/active_scaffold_overrides目录中。这一步需要手工来做,你也许会觉得不太方便,那是因为如果你已经在active_scaffold_overrides里面做了一些模板覆盖的话,直接强行copy会搞乱你本来的开发,所以你需要手工做一个merge。

用法

models/sneaker.rb

belongs_to :brand

def to_s
  "#{size}in #{brand} in #{color}"
end

controllers/sneakers_controller.rb

active_scaffold do |config|
  # 以active_scaffold的语法定义create的columns
  config.create.columns = :name, :brand, :size, :color

  # 添加动作batch_create
  config.actions.add :batch_create

  # batch_create的字段会从create.columns自动继承
  # 然后将那些需要批量输入的字段定义到batch_columns
  config.batch_create.batch_columns = :brand, :size, :color

  # 在batch_create里无需关注的字段(通常会在创建后自动生成,请看before_create_save)
  config.batch_create.ignore_columns = :name

  # 将关联字段的form_ui定义为select
  columns[:brand].form_ui  = :select
end

def before_create_save(name)
  return if record.name

  # 如果是从batch_create来的,则自动生成名称
  record.name = record.to_s
end

batch_create也支持活动脚手架的表单覆盖,命名规则是:字段名_batch_form_column。比如,对于品牌选择框,我们希望如果一种品牌已经超过20种运动鞋,就将它隐去,那么我们可以在helpers/sneakers_helper.rb中定义一个brand_batch_form_column方法:

def brand_batch_form_column(record, input_name)
  select_tag input_name + '[id][]', options_from_collection_for_select(
    Brand.find(:all).select{|brand| brand.sneakers.count < 20},
    "id", "name"), :multiple => true
end

Demo

这里是一个Demo,使用的就是上面运动鞋的例子。例子并没做汉化,相信大家都能看懂。如果你已经svn update了最新的l10n_scaffold插件,你会发现batch_create的汉化也在其中了。

2 Responses to “ActiveScaffoldExt之一:batch_create”

  1. 活动脚手架 » ActiveScaffoldExt之二:多选列表和批量删除 says:

    […] ActiveScaffoldExt之一我们介绍的是批量创建(batch_create)。那么当然也需要有一个批量删除。批量删除的首要条件是可以在列表里多选,这是在ActiveScaffold的论坛中很多人希望有的功能,于是,我们的第二个扩展就来实现多选列表和批量删除。 […]

  2. 活动脚手架 » ActiveScaffoldExt之三:过滤列表 says:

    […] 请参考批量创建的安装。 […]

Leave a Reply