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