`

Rails如何给表添加关联ID,并且设置值

 
阅读更多

最近遇到一个这样的问题,现在有这么几张表。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之前做一些事,这样就能够保证旧的接口能够继续工作了。

在开发的过程中,开发并不是最复杂的,旧数据的兼容才是重要的,我们要考虑的不简单的只是功能的实现。

 

 

 

 

分享到:
评论
1 楼 心静如止水 2014-09-01  

相关推荐

    关于Rails中的表关联的程序

    这意味着每个用户都有一个或零个订单,并且在订单表中存在对应的用户ID。 2. `has_one` 关联: 这表示一个模型有且仅有一个其他模型的实例。比如,一个地址(Address)模型可能`has_one`用户(User)。在Address模型...

    Rails3的ActiveRecord 查询API.doc

    Rails 3.1 及以后版本的 ActiveRecord 查询API发生了重大变化,主要目的是为了提供更清晰、更可维护的代码,并且提高性能。在 Rails 2.x 中,许多使用哈希参数的查询方法如 `:conditions`, `:include`, `:joins` 等...

    RestFul_Rails_Dev_pdf_v_0.1.zip

    Rails的资源路由还支持成员路由(Member Routes)和集合路由(Collection Routes),允许添加对单个资源或资源集合的操作,如`/users/1/edit`用于编辑用户1,`/users/search`用于搜索用户。 在Rails中,表单和链接...

    recurse-delete:Rails gem 在没有 N+1 的情况下递归删除自身和所有依赖关联

    ##递归删除当您在 Rails 中调用 Record.destroy 时,它会实例化其所有关联(即 :dependent => :destroy)并在每个关联上调用 destroy。 这是一个 N + 1,如果将关联设置为 :dependent => :delete_all,则可以删除...

    rails22新添功能.pdf

    Rails 2.2对线程安全性进行了优化,并且增加了对Ruby 1.9的支持。Ruby 1.9的发布标志着Ruby语言的重大升级,带来了许多性能上的提升和新特性。为了确保Rails能够在新版本的Ruby上运行得更加顺畅,开发团队进行了大量...

    Ruby-ActsAsTennant通过一个共享数据库的策略来为一个Rails应用添加多租户支持

    要在Rails项目中使用Acts As Tennant,首先需要在Gemfile中添加gem 'acts_as_tenant',然后运行`bundle install`。接着,在ApplicationRecord(或者ActiveRecord::Base,如果你使用的是较早版本的Rails)中包含Acts...

    Ruby-SimpleForm轻松处理Rails表单

    在Ruby on Rails框架中,构建表单是一项常见的任务,而Simple Form gem就是为了简化这一过程而设计的。Simple Form是一款强大的表单构建器,它提供了一种简洁、直观的方式来创建复杂的表单,使得开发者能更专注于...

    Agile Web Development with Rails中文版 3rd Edition

    通过ActiveRecord,开发者可以直接在模型类中定义表结构、字段、关联关系等,而无需编写复杂的SQL语句。 **2.3 ActionPack:视图与控制器** ActionPack提供了构建控制器和视图所需的工具。它包含了一系列帮助器...

    yeet_dba:自动将外键约束添加到rails db

    孤立行,表示关联表中不存在具有ID的行。 但是为什么要使用外键? 您可以通过检查id是否具有值而不是加载对象来保存自己的N + 1调用。 user . company . id # bad - N+1 user . company_id # good 但是,如果在...

    Rails中应用Ext.tree:以中国的省市地区三级联动选择为例

    这可以通过运行Rails的`db:schema:load`或`db:migrate`命令完成,前提是已经正确设置了数据库连接,并且在`schema.rb`或`migration`文件中定义了相应的表结构。 在前端部分,我们需要引入Ext.js库。由于Ext.js是一...

    Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rar

    第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 ...

    Ruby-ApartmentRack和Rails应用的数据库多租户

    要在Rails项目中使用Apartment,首先需要在Gemfile中添加gem 'apartment',然后运行`bundle install`。接着,需要在config/application.rb或对应的环境配置文件中初始化Apartment,并配置数据库连接。例如: ```...

    使用jsonapi设计的Rails应用程序的基本示例_Ruby_Java.zip

    Rails通过添加gem如`jsonapi-resources`来支持JSONAPI。 1. 安装`jsonapi-resources` 首先,你需要在Rails项目中添加`jsonapi-resources`gem。在Gemfile中添加以下行: ```ruby gem 'jsonapi-resources' ``` 然后...

    用rails做个简单的论坛(三):将之前的串连起来

    在数据库层面,我们需要为这些模型创建对应的表,并设置好相应的关联关系。例如,User可以拥有多个Post,Post可以包含多个Comment。 ### 二、路由配置 Rails的路由是应用中URL到控制器动作的映射。在`config/...

    Ruby-Globalize构建在I18nAPIinRubyonRails之上添加模型翻译至ActiveRecord模型

    Ruby on Rails是一个流行的开源Web应用程序框架,它使用Ruby编程语言。在开发多语言网站时,Globalize是一个不可或缺的工具,它扩展了Rails的内置I18n(国际化)API,为ActiveRecord模型提供了数据翻译功能。这个...

    redmine数据库所有表结构的介绍

    2. **projects**:记录了所有项目的详细信息,如项目ID、名称、描述、开始和结束日期、可见性设置等。每个Redmine实例可以包含多个项目。 3. **users**:包含了所有用户的资料,包括用户名、密码(通常加密存储)、...

    Ruby on Rails中的ActiveRecord编程指南

    虽然两者都能实现多对多的关系,但是`has_many :through`提供了更灵活的设计方案,可以在中间表添加额外的字段或进行复杂的验证逻辑。例如: ```ruby # 不推荐使用 has_and_belongs_to_many class User has_and_...

    Ruby-SeedFuRails的高级seed数据处理结合几种方法的最佳实践

    3. **避免硬编码**:尽量避免在种子数据中使用硬编码的ID,使用关联和外键来维护数据的完整性。 4. **数据更新**:当数据库结构发生变化时,更新种子文件以匹配新的结构。 5. **日志记录**:在种子数据操作过程中,...

    simple_json_api-rails

    SimpleJsonApi::Rails 遵循规范呈现 json 的 。 安装 将此行添加到应用程序的 Gemfile 中: gem 'simple_json_api-rails' 然后执行: $ bundle 或者自己安装: $ gem install simple_json_api-rails 用法 取...

Global site tag (gtag.js) - Google Analytics