with_scope.rb 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #---
  2. # Excerpted from "Agile Web Development with Rails",
  3. # published by The Pragmatic Bookshelf.
  4. # Copyrights apply to this code. It may not be used to create training material,
  5. # courses, books, articles, and the like. Contact us if you are in doubt.
  6. # We make no guarantees that this code is fit for any purpose.
  7. # Visit http://www.pragmaticprogrammer.com/titles/rails4 for more book information.
  8. #---
  9. require 'prelude'
  10. ActiveRecord::Schema.define do
  11. create_table :orders, :force => true do |t|
  12. t.column :user_id, :integer
  13. end
  14. create_table :users, :force => :true do |t|
  15. t.column :name, :string
  16. end
  17. end
  18. class User < ActiveRecord::Base
  19. has_many :orders
  20. end
  21. class Order < ActiveRecord::Base
  22. belongs_to :user
  23. end
  24. ned = User.create(:name => 'Ned')
  25. mike = User.create(:name => 'Mike')
  26. nicole = User.create(:name => 'Nicole')
  27. Order.create(:user => ned)
  28. Order.create(:user => mike)
  29. Order.create(:user => nicole)
  30. Order.create(:user => ned)
  31. Order.create(:user => mike)
  32. Order.create(:user => nicole)
  33. Order.create(:user => ned)
  34. puts :unscoped
  35. p User.find(:all) #=> [#<User:0x77d38c @attributes={"name"=>"Ned", "id"=>"1"}>,
  36. # #<User:0x77d314 @attributes={"name"=>"Mike", "id"=>"2"}>,
  37. # #<User:0x77d2d8 @attributes={"name"=>"Nicole", "id"=>"3"}>]
  38. puts :scoped
  39. User.with_scope(:find => { :conditions => "name like '%i%'"}) do
  40. p User.find(:all) #=> [#<User:0x5ff7b8 @attributes={"name"=>"Mike", "id"=>"2"}>,
  41. # #<User:0x5ff2e0 @attributes={"name"=>"Nicole", "id"=>"3"}>]
  42. end
  43. puts :scoped1
  44. User.transaction do
  45. User.with_scope(:find => { :conditions => "name like '%i%'"}) do
  46. p User.count #=> 2
  47. User.delete_all
  48. p User.count #=> 0
  49. end
  50. p User.count #=> 1
  51. raise "rollback"
  52. end rescue 1;
  53. puts :indirect
  54. User.with_scope(:find => { :conditions => "name like '%i%'"}) do
  55. Order.find(:all).each do |o|
  56. p o.user
  57. end
  58. end
  59. puts :order
  60. begin
  61. User.with_scope(:find => {:readonly => true}) do
  62. user = User.find_by_name('Ned')
  63. user.name = 'Walter'
  64. user.save!
  65. end
  66. rescue Exception => e
  67. puts e.message
  68. end
  69. puts :include_find
  70. User.with_scope(:find => { :conditions => "name like '%i%'"}) do
  71. p User.find(:all, :conditions => "name like 'N%'")
  72. end
  73. puts :nest_scope
  74. User.with_scope(:find => { :conditions => "name like '%i%'"}) do
  75. User.with_scope(:find => { :conditions => "name like 'N%'"}) do
  76. p User.find(:all) #=> [#<User:0x78f5dc @attributes={"name"=>"Nicole", "id"=>"3"}>]
  77. end
  78. end
  79. puts :excl_scope
  80. User.with_scope(:find => { :conditions => "name like '%i%'"}) do
  81. User.with_exclusive_scope(:find => { :conditions => "name like 'N%'"}) do
  82. p User.find(:all) #=> [#<User:0x7876ac @attributes={"name"=>"Ned", "id"=>"1"}>,
  83. # #<User:0x787580 @attributes={"name"=>"Nicole", "id"=>"3"}>]
  84. end
  85. end