Posts Tagged ‘activerecord’

Rails3 中 ActiveRecord API 的变化

Friday, May 14th, 2010

Rails3 中 ActiveRecord API 的变化从书写上看已经是翻天覆地了,过去查询条件都是用 hash 的方式写到 finder 里面,现在全部转化成了 method 调用的串联。

比如过去的:

Post.find(:all, :condition => “user_id = 1″, :order => “id desc”, :limit => 10, :include => :replies)

在 rails3 中要写成:

Post.where(”user_id=1″).order(”id desc”).limit(10).includes(:replies)

看上去好似 named_scope

完全正确,rails3 针对 AR API 改写的目标就是:Everything is named_scope.

rails3 中对 ActiveRecord 的 API 改写成了完全符合 ActiveModel API 的样子。而 ActiveModel 相当于 ORM 这一层的接口,ActiveRecord 是一种具体实现,当其他的 ORM(如 DataMapper)都复合 ActiveModel 这样的接口时,针对 model 部分的插件(如 will_paginate)就可以通用了。

脱离Rails使用ActiveRecord在多个数据库之间做数据迁移

Thursday, February 7th, 2008

ActiveRecord 是好东西,可以简化很多代码,在 Rails 之外做数据维护时也是超级好用。今天需要在两个数据库之间做下数据迁移,因为 schema 有变,所以 mysqldump 基本没什么用。

先是发现了一个 ar_fixture 的插件,使用方法极度简单,但是出现了 UTF-8 不支持的问题,我数据库里使用中文的字段竟然按照 binary 处理,不理解。

最终找到一篇文章很靠谱,实验一下,问题搞定。

先写一个数据库配置文件 database.yml

db1:
adapter: mysql
host: localhost
username: root
password:
database: database1
db2:
adapter: mysql
host: mysql
username: root
password:
database: database2

然后写一个 imgration.rb

require ‘rubygems’
require ‘active_record’
require ‘yaml’

$config = YAML.load_file(File.join(File.dirname(__FILE__), ‘database.yml’))

class Database1 < ActiveRecord::Base
establish_connection $config['db1']
end

class Database2 < ActiveRecord::Base
establish_connection $config['db2']
end

module A
class Tb1 < Database1
set_table_name 'tablename1'
end
end

module B
class Tb2 < Database2
set_table_name 'tablename2'
end
end
... your task process ..

把两个数据库分别写在两个 module 里面,好处是可以避免命名空间冲突, 坏处是代码多了一点,调用时应该:

tb1 = A::Tb1.find :all
tb2 = B::Tb2.find :all

ActiveRecord中使用的find

Friday, May 11th, 2007

首先不要用find helper,也就是那些find_by_colName,效率差

第二,像直接写SQL一样做tunning,不要简单的find(:all),仔细看最后生成的SQL,要额外关注:joins, :include, :order, :select
利用:join, :include可以完成连接,从效率上看很有必要,虽然用起来稍微麻烦点。完全以来与ActiveRecord生成的object relationship的话代码写起来很爽,但是会多出很多的SQL.

:order很简单,但是仔细看系统会根据model里面的has_, belong_关系为你多加上一个order by

不用:select就相当于select *,当你的table中有大量文本的时候这个很恐怖

此外也不要过多的依赖find_by_sql, 这样会很大程度上破坏ActiveRecord完成的mapping工作, 尤其是在项目前期。这样的sql tunning还是留到后面的重构中吧,起码等到这个需要确定要保留下来的时候:)

使用ORMapping后数据库设计的问题

Thursday, May 10th, 2007

之前系统中直接保存post的title和description, 在显示的时候要对title对一个strip操作,比如将Free Memory修改为free-memory,用于friendly url. 将description做截断用于列表中的显示.

现在发现这样是完全不靠谱的, 首先上面提到的两个运算会发生在每次请求过程中, 虽然可能耗时不多, 但是在一个开放的Web系统中这样的开销仍然是一种罪恶!

其次的问题发生在ORMapping的使用中, 参考typo的方法, Post model中有一个stripped_title的方法, 用于生成stripped title, 而产生的问题是今后我的操作必须严格依照object relationship, 无法进行SQL scale. 比如我想取所有的comments, 顺便要left join posts, 这样stripped title将无法得到….如果使用comment.post.stripped_title看似很爽,但是在log中很明显可以看出SQL多了几条, 这样的开销是不被允许的.

最后的办法就是在执行New, Update操作时一定要直接生成 stripped title, excerpt并保存在数据库中. 切记切记 TOT