最近遇到一个这样的问题,现在有这么几张表。user customer identity, 一个user拥有多个customer,一个customer拥有多个identity.
User 表
id integer, name varchar(255), password varchar(255)
custmer表
id integer, user_id, integer name, varchar(255) phone,varchar(11)
identify表
id, integer customer_id, integer key, varchar(255) value varchar(255)
问题出在这张identity表上。没有存user_id。导致的问题是在找某个user下面所有有某个idetity的customer的时候很费劲。
首先得从customer表中找到user的所有的customer,然后去遍历identity表,找到customer并且是有某个值的customer。如果用rails的activerecord会很麻烦。所以用sql去查询,但是似乎也不是很简单
select * from customer as c , identity as i where(c.user_id = user_id and c.id = i.customer_id and i.key = 'key' and i.value='value')
这样似乎会简单一些。(为什么没有用表关联,是因为customer这张表是数据基本表,很多表都依赖他,不像让它变得太复杂)看用sql语句会简单一些。但是看起来还是麻烦一些。因为在做反向查询的时候会不断的去连表查。解决办法是给identity表加上一个user_id字段。使用有两种方式。sql和rails migration。先说sql
alert table identity add user_id int(10) not null default 0 ; update identify as i set user_id=(select user_id from customer as c wherer i.customer_id = c.id) //update这条sql语句没有试过,当时考虑到它又缺点,没有采用。
刚刚说道这条sql语句有问题,是因为在这里添加了user_id并对旧数据进行了兼容。但是程序中某些地方在存customer的identity的时候并没有提供user_id,所以采用的rails的activityrecord,前半部分和sql一样
add_column :identity, :user_id, :ingeter Identity.all.each do |item| customer = Customer.find_by( {:customer_id => item.customer_id}) if customer.present? && customer.user_id.present? && item.user_id.nil? item.user_id = customer.user_id item.save end end
这部分和上面的sql语句大同小异,只是增加了一些冗余判断,是因为发现在执行sql的时候会报出user_id为空的时候,下面说另外一部分:怎么兼容旧接口。
class Identity before_save: save_default_user_id def save_default_user_id if self.user_id.nil? customer = Customer.find_by( {:id => self.customer_Id} ) if customer.present? && customer.user_id.present? self.user_id = customer.user_id end end end end
这块是rails提供的before_save 他能够在commit之前做一些事,这样就能够保证旧的接口能够继续工作了。
在开发的过程中,开发并不是最复杂的,旧数据的兼容才是重要的,我们要考虑的不简单的只是功能的实现。
相关推荐
rails-settings, 使用 Ruby on Rails 管理设置 Rails的设置 ruby gem,通过在单独的数据库表中将它们存储为序列化的哈希来处理。 包含命名空间和默认值。要求ruby 1.9.3或者更高版本Rails 3.1或者更高版本( 包括 ...
NULL 博文链接:https://hlee.iteye.com/blog/591526
css和图片 博文链接:https://hideto.iteye.com/blog/197517
bower-rails, 在 Rails 上,为 Bower 设置类似 DSL + rake任务 rails Bower 对 Rails 项目的支持。 依赖文件是 Rails root 目录中的bower.json,如果使用 DSL,则为 Bowerfile 。 查看最新变更和发布的变更日志文件...
《Rails之道》按照Rails的各个子系统进行组织编排,分别介绍了Rails的环境、初始过程、配置和日志记录,Rails的分配器、控制器、页面生成和路由,REST、资源和Rails,ActiveRecord的基础、关联、验证和高级技巧,...
rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails ...
免费资源、免费资源、免费资源!...在整个网站都找了,几乎没有我想要的样子,没有个完整版本的,要不就是要钱下载,一气之下 为大家花费了一周的时间 初略整理了一下 目前最新版本的redmine表结构和关联关系。
chef-rails, 厨房设置一个可以与 Nginx 和 Rails 一起滚动的Ubuntu服务器 主厨 rails安装一个准备为 Ruby on Rails 栈准备的Ubuntu服务器:NginxPostgreSQLRedisMemcached带RVM的rubyPhusion乘客独立要求Ubuntu ...
adminlte-rails, AdminLTE Rails gem 将AdminLTE主题与 Rails 资产管道集成 AdminLTE Rails gem AdminLTE 是后端的高级 Bootstrap 主题。英镑 AdminLTE Rails gem 与 Rails 资产管道集成了英镑AdminLTE主题。安装将...
那么 rails railsrailsrails会自动把该数据表与 会自动把该数据表与 其模型类进行关联。 REST 是 WEBWEB 应用的最佳模式 应用的最佳模式 - 用 resourcesresourcesresourcesresourcesresourcesresources resources...
本文介绍如何开始使用Ruby on Rails,读完本文后,您将学到: 如何安装Rails,创建Rails应用,如何连接数据库; Rails应用的基本文件结构; MVC(模型,视图,控制器)和REST架构的基本原理; 如何快速生成Rails应用...
sass-rails, Sass的Ruby on Rails 样式表引擎 与Sass的官方Ruby-on-Rails集成这个 gem 使用Sass样式表语言为 Ruby on Rails 项目提供正式的集成。安装从 Rails 3.1开始,新的Rails 项目将被配置为使用 Sass 。 如果...
《Ruby on Rails Tutorial》中文版(原书第2版,涵盖 Rails 4) Ruby 是一门很美的计算机语言,其设计原则就是“让编程人员快乐”。David Heinemeier Hansson 就是看重了这一点,才在开发 Rails 框架时选择了 Ruby...
一个用Ruby on Rails搭建的图片分享的网站项目.完整源代码
Ruby on Rails Guides v2 - Ruby on Rails 4.2.5
[Pragmatic Bookshelf] Crafting Rails Applications Expert Practices for Everyday Rails Development (E-Book) ☆ 图书概要:☆ Rails 3 is a huge step forward. You can now easily extend the framework, ...
rails文档 rails api 英文
中文世界唯一一本Rails 4.0.0 + Ruby 2.0.0 的自學書籍
Draper - 将面向对象的表示逻辑层添加到您的Rails应用程序
rails2-sample good book