Rails Model基础

07 Apr 2013, by

约定column不可用字段

Model常见方法

Record查询中joins和include的区别

关联表排行榜统计例子

Model.where_time(self.start_end_time(time))
          .where_records(type_id)
          .group(:user_id)
          .select("user_id, sum(column_name) as rank")
          .order("rank desc")
          .map(&:user_id)

Mysql2::Error: Data too long for column 的解决方案(使用utf8mb4)

MySQL utf8mb4 字符集 修改database、table和column字符集

For each database: 
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
For each table: 
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
For each column: 
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Rails使用mysql存储大字段

collation: utf8mb4_unicode_ci

save和new区别

save:rails中的save其实是 create_or_update ,新建或修改记录!不一定是新建。
new :只是在内存中新建一个对象,操作数据库要调用save方法。
create = new + 执行sql。
build:与new基本相同,多用于一对多情况下。
!:new!, create!, build!与new, create, build的区别是带!的方法会显示validate的错误信息,如果验证失败会抛出导常(主要的是不跳过验证)。
save是实例方法,而create, build, new是模型类的类方法
before_save和before_create 最大的一个区别就是,update 也算是 before_save

model中验证唯一性

validates :comicid , :uniqueness=>{:scope => [:orderid]} comicid, orderid的组合唯一

当model缓存不对时reload

info = error_offline.info
puts info.id
error_offline.destroy
# info.offline.destroy
# info.reload

当记录查找出来赋值时,对象信息被缓存,需要reload

where和like例子

Offline.where("file_url LIKE ? ","%2173681a888870928888a15234.zip%").first.file_url

一对多数量查询

表1:users,表2:books。 每个user对应若干books,

查每个user在一个时间段的books数量:

Book.where("created_at > ?", 1.day.ago).group(:user_id).select("user_id, count(*) AS books_count").order("books_count DESC")

排序每个user的books数量排名:

belongs_to :user, counter_cache: true
在user表中加入books_count字段
Book.order("books_count DESC")

关联表查询