with_scope.rb 3.2 KB

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