日期:2014-05-16 浏览次数:20522 次
a = Category.new(:name => 'Ruby', :position => 1) a.save # save 还有相同方法”save!” # 有无惊叹号的差别在于validate资料验证不正确的动作, # 无惊叹号版本会回传布林值(true或false),有惊叹号版本则是验证错误会丢出例外。 b = Category.create(:name => 'Perl', :position => 2) # create也有“create!”方法,作用同save # create在执行的时候已经将资料插入数据库,无须再调用save方法 b.save(:validate => false) # 透过:valiate => false 可以略过验证 # create虽然无需再调用save方法,但仍然可以调用save方法。 Category.first # 取出第一条记录 Category.last # 取出最后一条记录 Category.all # 取出所有 Category.find(1) # 取出id=1的记录 Category.find(1, 3) Category.find([1, 3]) # 取出id为1和3的记录 # find方法会在没有取到符合条件的记录时抛出错误 # 如果你不想这样,请用:find_by_id Category.find_by_name('Ruby') # 取出name字段等于“Ruby”的记录 # 可以用and进行多字段查询 Category.find_by_name_and_postion('Ruby', 1) # 取出name='ruby' and postion=1的记录 # find_by_* 和 find_all_by_*它们的不同之处是前者会进行“limit 1”限制 Category.find_by_sql("SELECT * FROM categories WHERE name LIKE '%p%'") # 如果你想自己手写sql就可以使用这个方法 # find_by_sql没有“find_all_by_sql”方法 Category.where(:name => 'Ruby', :position => 1) # `name` = 'Ruby' AND `position` = 1 Category.where(["name = ? or position = ?", 'Ruby', 3]) # `name` = 'Ruby' OR `position` = 3 # 另外,where 是lazy loading,也就是直到真的需要取值的时候,才会跟资料库拿资料。 # 如果需要立即触发,可以接着使用.all, .first, .last,例如: # Category.where(["name = ? or position = ?", 'Ruby', 3]).all Category.limit(5).all # 限制查询记录数,它只接受这一个参数 # 如果要使用形如:“limit x, y"请组合使用“offset”方法 Category.order("position") Category.order("position DESC") Category.order("position DESC, name ASC") # 对内容排序 Category.order("position").reorder("name") # 改用name 排序 Category.order("position").reorder(nil) # 取消所有排序 Category.limit(3).offset(2) # 从第二条开始显示3条记录 Category.select('id, name') # 只查询出id,name栏位的数据 Category.readonly.first # 使用readonly可以使查询出来的结果不能再次改变其值 # 以上查询方法可以进行无顺序的自由的串接: # Category.select(..).order(..).limit(.).... Category.where("position > 1").find_each do |category| category.do_some_thing end # 如果资料量很大,但是又需要全部拿出来处理,可以使用find_each 批次处理 Category.find_each(:batch_size => 2) do |category| puts category.id end # 预设会批次查出1000条,如果需要设定可以加上:batch_size 参数。 c = Category.all c.reload # reload 重新查询出结果给c c = Category.first c.destory # 删除id = c.id的资料 Category.delete(2) # 删除id = 2的资料 Category.count # 获取记录总数 Category.average(:position) Category.maximum(:position) Category.sum(:position) # 略过... Category.where(["position>?", 2]).count # 用where缩小范围 c = Category.first c.update_attributes(:position => 6) # or # 注意下边这个,我照书上抄的,老是报错,好像不行,试着传hast,array,symbol都不行 # 版本 3.1.0 c.update_attributes('position', 6) # 更新id = c.id的记录使栏柆position=6 # 同类方法:“update_attributes!” a = Order.select("*,sum(price) as p,count(*) as c").where("a=? ",2).group("date_format(created_at,'%Y-%m')") #select 指定要查询的字段 #group 分组 # date_format mysql中的时间格式化