小试rails当中对多重选择表单的处理

keys: ruby rails multiple checkbox

今天上班给老板写个项目销售管理的小东西,其中涉及到多重选择的处理。目前感觉rails在这方面相对弱,也许因为rails在其它方面太强了吧。总之,对于用rails处理multiple checkbox,还真需要些基础知识。

例子中的任务是为一个项目project指定人员user_file,这显然是一个N对N(HABTM)的关联,按照David的建议,我把关联表project_user_map也作为实体处理了。

介绍一下模型 model:

class Project …
has_many :project_user_maps
end

class ProjectUserMap

belongs_to :project
belongs_to :user_file
end

class UserFile
has_many :project_user_maps
end

先说view:

<% form_tag :action => ‘edit_member_2’, :id => @project do %>
<% for user_file in @all%>
<%= check_box_tag( ‘selected_file_ids[]’, user_file.id, @members.include?(user_file))%><%= user_file.name%>
<% end %>
<br/>
<%= submit_tag ‘完成!’ %>
<% end %>

要点是selected_file_ids[],这样提交以后,rails会生成一个对应的数组。@all是全部可选项;@members是被选中的选项。

然后是controller:

def edit_member_2
@project = Project.find(params[:id])
member_ids = params[:selected_file_ids]
ProjectUserMap.transaction do
@project.project_user_maps.each { |pum|
pum.destroy
}
member_ids.each {|uf|
m = ProjectUserMap.new
m.user_file_id = uf
@project.project_user_maps << m
m.save()
}
@project.save
end
redirect_to :action => ‘show’, :id => @project
end

这段只能说运行没问题,肯定还有改进余地的:) 参考1

牛刀小试RegEx

img_regex_big.gif

RegEx中文叫做正则表达式,虽然不是很新的东西了,我很纳闷我居然是才开始了解它。在数据库中查询keyword一般是写成

select * from tablename where columnname LIKE ‘%keyword%’

而java我记得不是很清楚了,大概是

if(myString.indexOf(keyword) != -1){
//do things…
}

这个只是简单匹配,如果有复杂要求就要写多得多的代码了。例如判断keyword是否是一个数字开头,紧跟1个小写字母,跟随若干数字,最后以”pattern”结尾等等,就不是一行代码能写出来的了。对于上例,RegEx+Ruby的写法就是

if keyword =~ /^\d[a-z]\d+pattern$/
#do things
end

上式中,//是RegEx的边界,类似””是字符串的边界一样。接下来^代表匹配的开始;\d代表数字,就是0 – 9;[a-z]就是一个从a到z的小写字母了;+是后缀,表示1个或多个,因此\d+就是1个或多个数字的意思了;最后作为关键字的pattern直接写上即可;$代表匹配的结束。

更灵活的应用就是|符号和()括号了。例如判断文本是否包含x或X,RegEx就可以写

/x|X/

如果要判断文本是否包含多个连续的x或者X,例如xXX、XxX,RegEx就可以写

/(x|X)+/

如果要判断文本是否包含XXX、XXXX、XXXXX,RegEx可以写

/X{3,5} /

目前的了解就是这么多了,不过以上这些组合起来应该已经可以应付很多种情况了。继续学习。