Ruby-ActiveRecord(pluck,find_each,transactive,after_commit,touch,changes,connection_pool,arel_table)

93 篇文章 1 订阅
12 篇文章 0 订阅

Ruby-ActiveRecord(pluck,find_each,transactive,after_commit,touch,changes,connection_pool,arel_table)

推荐使用:

pluck rails 4

[10] pry(main)> AdminUser.all.pluck(:name, :desc)
   (0.2ms)  SELECT "users"."name" FROM "users"
=> ["MenDD", "MenDDAIR"]

transaction

ActiveRecord::Base.transaction do
  blog = Blog.find(1)
  blog.reviews.each do |review|
    review.temp_update!
  end
end

transaction 嵌套 require_new

为了保证一个子事务的 rollback 被父事务知晓,必须手动在子事务中添加 :require_new => true 选项

User.transaction do
  User.create(:username => 'Kotori')
  User.transaction(:requires_new => true) do
    User.create(:username => 'Nemu')
    raise ActiveRecord::Rollback
  end
end

find_each

Blog.find_each(batch_size: 5000) do |blog|
  reviews.weekly_deliver(blog)
end

after_commit / after_rollback

class Blog < ActiveRecord::Base
  after_commit :enqueue_for_review

  # ...
end
ActiveRecord::Base.transaction do
  Blog.create!(
    title: 'A New Blog',
    author_id: 3,
    content: 'Blah blah...'
  )

  raise StandardError, 'Something Happened'
end

touch(规模以上系统建议少用)

review.touch(:last_viewed_at)

changes

1> changed?
review = Review.find(1)
review.book_id = 5
review.changed?
# => true

2> <attribute>_was

review = Review.find(1)
review.status = 'Approved'
review.status_was
# => 'Pending'

connection_pool

def method(*args)
  ActiveRecord::Base.connection_pool.with_connection do
    # ActiveRecord do something connection.execute(sql)
  end
ensure
  ActiveRecord::Base.clear_active_connections!
  ActiveRecord::Base.connection.close
end

arel_table

t = Product.arel_table
Product.where(t[:subname].eq(id).or(t[:id].eq(id))).first

原文:
http://jakeyesbeck.com/2016/03/27/five-more-active-record-features-you-should-be-using/?utm_source=rubyweekly&utm_medium=email

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值