当前位置: 首页 > news >正文

%check_box% in rails :coditions={:has_many , :through}

刚才算是把rails里的checkbox透彻的理解了一下

在railscast关于check box讲解的那一集里,提到了check box在habtm中的用法,简单的说一下,还是通过实例:
现在有product和category两个模型,
那么在模型中声明:
#category
has_and_blongs_to_many products
#product
has_and_blongs_to_many category

还要记得加上中间的连接表categories_products,加上外键字段product_id, category_id
在数据库迁移中,product有name:string,在category中也加上

一切都搞定之后,重点看视图中的内容,就是在new和edit模板引用的那个_form局部模板中在submit按钮之前,添加下面的代码:

InBlock.gif<% categories.each  do |category|%>
InBlock.gif    <%= check_box_tag  "product[:category_ids][]",
InBlock.gif                                    category.id,
InBlock.gif                                   @product.categories.include?(category)%>
InBlock.gif        <%= category.name%>
InBlock.gif<% end %>

product[:category_ids][]是check box 的name属性,这里声明为一个数组.
category.id 是check box对应的value属性
@product.categories.include?(category) 这是默认选择的设置,在edit调用时,@product是传入的对象,执行这句会得到true 或者false,也就会出现对应的是否默认checked

那么还有一点注意的就是当check box 不提交任何内容的时候,在发送params时,product[:category_ids][]数组就不出现在参数里,所以也就不会在action中执行任何动作.

所以在update这个action中,一定要说明product[:category_ids][]为空情况该怎么办:

params[:product][:category_ids] ||=[]

这就告诉rails在update动作的时候注意params[:product][:category_ids]到底有值传过来没有,如果没有就赋为空数组.

剩余的事情就交给rails来搞定了..因为这里的product的category_ids方法是habtm里自带的,所以你可以这么用


但是换种情况,通过has_many , through来连接两个模型呢?

下面通过一个例子来说明:

譬如在学生选课系统中,因为中间表要加入成绩字段,所以必须做成是has_many , through方式来实现.
环境mac, rails 1.2.5 , mysql5.0, IDE:textmate

apples-acpi:project mac$ rails product

apples-acpi:project mac$ cd product


apples-acpi:product mac$ ruby script/generate scaffold_resource student name:string 

apples-acpi:product mac$ ruby script/generate scaffold_resource course name:string 

apples-acpi:product mac$ ruby script/generate model relation student_id:integer course_id:integer score:integer

apples-acpi:product mac$ mysqladmin -u root create product_development


apples-acpi:product mac$ ruby script/server


首先打开[url]http://localhost:3000/courses[/url]
添加几项course数据

在students/view中把new和edit的那段表单代码放到_form.rhtml中,修改之后如下:






因为这里关系已经不是habtm了,所以如果提交表单的话会出现错误,所以在student.rb中写入 course_ids=



这里是一个数组计算的问题,那么怎么更新relations中的数据呢,对于某一个student对象来说,设提交的数组为commit_array, 原先存在数据库中的关系数组为db_array, 那么需要添加的数据就是commit_array-db_array, 需要删除的数据就是db_array-commit_array

举个例子来说
如果提交的commit_array为[1,2,3,4]原来数据库中存储的是[1,2,3]很明显,需要在数据库中添加[4],也就是commit_arry-db_array

如果提交的commit_array为[1,2],原来数据库中存储的是[1,2,3,4]那么,需要删除[3,4]也就是db_array-commit_array

这样就实现了这个_ids的属性.




本文转自 fsjoy1983 51CTO博客,原文链接:http://blog.51cto.com/fsjoy/113342,如需转载请自行联系原作者

相关文章:

  • 今天您脚本了吗?
  • 快速构建Windows 8风格应用11-语义缩放
  • btrfs的使用(案例讲解)
  • 针对nginx、haproxy、lvs 的优缺点分析
  • Asp.net中Json数据的转化,读取与应用
  • Octave添加package方法
  • 【Android Demo】Android中取得手机屏幕大小
  • JFace中的表格型树TableTreeViewer
  • IE8中HTTP连接数目的变化
  • 实时游戏对战引擎Photon
  • python入门系列之一:Centos6下python2.7的安装
  • Skype For Business 2015实战系列19:统一通讯之配置Exchange 2013 SP1
  • nginx部署
  • redhat 6.5 配置WAS控制台中文
  • filebeat 配置文件详解
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Java多线程(4):使用线程池执行定时任务
  • jdbc就是这么简单
  • Laravel核心解读--Facades
  • linux学习笔记
  • maya建模与骨骼动画快速实现人工鱼
  • vue-router的history模式发布配置
  • Vultr 教程目录
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 设计模式走一遍---观察者模式
  • 微服务核心架构梳理
  • 想使用 MongoDB ,你应该了解这8个方面!
  • AI算硅基生命吗,为什么?
  • (2020)Java后端开发----(面试题和笔试题)
  • (27)4.8 习题课
  • (7)STL算法之交换赋值
  • (二)fiber的基本认识
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (十一)c52学习之旅-动态数码管
  • (原)Matlab的svmtrain和svmclassify
  • (转)平衡树
  • .md即markdown文件的基本常用编写语法
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET Project Open Day(2011.11.13)
  • .NET 使用 XPath 来读写 XML 文件
  • @vue/cli脚手架
  • [20160807][系统设计的三次迭代]
  • [Android Pro] AndroidX重构和映射
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [C++随笔录] 红黑树
  • [Django开源学习 1]django-vue-admin
  • [Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包