最近遇到一个这样的问题,现在有这么几张表。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之前做一些事,这样就能够保证旧的接口能够继续工作了。
在开发的过程中,开发并不是最复杂的,旧数据的兼容才是重要的,我们要考虑的不简单的只是功能的实现。
相关推荐
这意味着每个用户都有一个或零个订单,并且在订单表中存在对应的用户ID。 2. `has_one` 关联: 这表示一个模型有且仅有一个其他模型的实例。比如,一个地址(Address)模型可能`has_one`用户(User)。在Address模型...
Rails 3.1 及以后版本的 ActiveRecord 查询API发生了重大变化,主要目的是为了提供更清晰、更可维护的代码,并且提高性能。在 Rails 2.x 中,许多使用哈希参数的查询方法如 `:conditions`, `:include`, `:joins` 等...
Rails的资源路由还支持成员路由(Member Routes)和集合路由(Collection Routes),允许添加对单个资源或资源集合的操作,如`/users/1/edit`用于编辑用户1,`/users/search`用于搜索用户。 在Rails中,表单和链接...
##递归删除当您在 Rails 中调用 Record.destroy 时,它会实例化其所有关联(即 :dependent => :destroy)并在每个关联上调用 destroy。 这是一个 N + 1,如果将关联设置为 :dependent => :delete_all,则可以删除...
Rails 2.2对线程安全性进行了优化,并且增加了对Ruby 1.9的支持。Ruby 1.9的发布标志着Ruby语言的重大升级,带来了许多性能上的提升和新特性。为了确保Rails能够在新版本的Ruby上运行得更加顺畅,开发团队进行了大量...
要在Rails项目中使用Acts As Tennant,首先需要在Gemfile中添加gem 'acts_as_tenant',然后运行`bundle install`。接着,在ApplicationRecord(或者ActiveRecord::Base,如果你使用的是较早版本的Rails)中包含Acts...
在Ruby on Rails框架中,构建表单是一项常见的任务,而Simple Form gem就是为了简化这一过程而设计的。Simple Form是一款强大的表单构建器,它提供了一种简洁、直观的方式来创建复杂的表单,使得开发者能更专注于...
通过ActiveRecord,开发者可以直接在模型类中定义表结构、字段、关联关系等,而无需编写复杂的SQL语句。 **2.3 ActionPack:视图与控制器** ActionPack提供了构建控制器和视图所需的工具。它包含了一系列帮助器...
孤立行,表示关联表中不存在具有ID的行。 但是为什么要使用外键? 您可以通过检查id是否具有值而不是加载对象来保存自己的N + 1调用。 user . company . id # bad - N+1 user . company_id # good 但是,如果在...
这可以通过运行Rails的`db:schema:load`或`db:migrate`命令完成,前提是已经正确设置了数据库连接,并且在`schema.rb`或`migration`文件中定义了相应的表结构。 在前端部分,我们需要引入Ext.js库。由于Ext.js是一...
第19章 ActiveRecord第二部分:表间关联 265 19.1 创建外键 266 19.2 在模型对象中指定关联 267 19.3 belongs_to和has_xxx声明 268 19.4 连接多张表 280 19.5 自引用的连接 287 19.6 Acts As 288 19.7 何时保存 291 ...
要在Rails项目中使用Apartment,首先需要在Gemfile中添加gem 'apartment',然后运行`bundle install`。接着,需要在config/application.rb或对应的环境配置文件中初始化Apartment,并配置数据库连接。例如: ```...
Rails通过添加gem如`jsonapi-resources`来支持JSONAPI。 1. 安装`jsonapi-resources` 首先,你需要在Rails项目中添加`jsonapi-resources`gem。在Gemfile中添加以下行: ```ruby gem 'jsonapi-resources' ``` 然后...
在数据库层面,我们需要为这些模型创建对应的表,并设置好相应的关联关系。例如,User可以拥有多个Post,Post可以包含多个Comment。 ### 二、路由配置 Rails的路由是应用中URL到控制器动作的映射。在`config/...
Ruby on Rails是一个流行的开源Web应用程序框架,它使用Ruby编程语言。在开发多语言网站时,Globalize是一个不可或缺的工具,它扩展了Rails的内置I18n(国际化)API,为ActiveRecord模型提供了数据翻译功能。这个...
2. **projects**:记录了所有项目的详细信息,如项目ID、名称、描述、开始和结束日期、可见性设置等。每个Redmine实例可以包含多个项目。 3. **users**:包含了所有用户的资料,包括用户名、密码(通常加密存储)、...
虽然两者都能实现多对多的关系,但是`has_many :through`提供了更灵活的设计方案,可以在中间表添加额外的字段或进行复杂的验证逻辑。例如: ```ruby # 不推荐使用 has_and_belongs_to_many class User has_and_...
3. **避免硬编码**:尽量避免在种子数据中使用硬编码的ID,使用关联和外键来维护数据的完整性。 4. **数据更新**:当数据库结构发生变化时,更新种子文件以匹配新的结构。 5. **日志记录**:在种子数据操作过程中,...
SimpleJsonApi::Rails 遵循规范呈现 json 的 。 安装 将此行添加到应用程序的 Gemfile 中: gem 'simple_json_api-rails' 然后执行: $ bundle 或者自己安装: $ gem install simple_json_api-rails 用法 取...