mirror of
https://github.com/aasm/aasm
synced 2023-03-27 23:22:41 -04:00
bugfix: make sure that scopes are still generated, even with the new DSL
This commit is contained in:
parent
e121807e30
commit
3860e57c72
4 changed files with 42 additions and 33 deletions
|
@ -3,10 +3,10 @@ module AASM
|
|||
def self.included(base) #:nodoc:
|
||||
base.extend AASM::ClassMethods
|
||||
|
||||
AASM::Persistence.set_persistence(base)
|
||||
unless AASM::StateMachine[base]
|
||||
AASM::StateMachine[base] = AASM::StateMachine.new('')
|
||||
end
|
||||
AASM::Persistence.set_persistence(base)
|
||||
super
|
||||
end
|
||||
|
||||
|
|
|
@ -38,19 +38,6 @@ module AASM
|
|||
base.send(:include, AASM::Persistence::ActiveRecordPersistence::WriteState) unless base.method_defined?(:aasm_write_state)
|
||||
base.send(:include, AASM::Persistence::ActiveRecordPersistence::WriteStateWithoutPersistence) unless base.method_defined?(:aasm_write_state_without_persistence)
|
||||
|
||||
if base.respond_to?(:named_scope) || base.respond_to?(:scope)
|
||||
base.extend(AASM::Persistence::ActiveRecordPersistence::NamedScopeMethods)
|
||||
|
||||
base.class_eval do
|
||||
class << self
|
||||
unless method_defined?(:aasm_state_without_scope)
|
||||
alias_method :aasm_state_without_scope, :aasm_state
|
||||
alias_method :aasm_state, :aasm_state_with_scope
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if ActiveRecord::VERSION::MAJOR >= 3
|
||||
base.before_validation(:aasm_ensure_initial_state, :on => :create)
|
||||
else
|
||||
|
@ -245,18 +232,22 @@ module AASM
|
|||
end
|
||||
end
|
||||
|
||||
module NamedScopeMethods
|
||||
def aasm_state_with_scope name, options = {}
|
||||
aasm_state_without_scope name, options
|
||||
|
||||
unless self.respond_to?(name)
|
||||
scope_options = {:conditions => { "#{table_name}.#{self.aasm_column}" => name.to_s}}
|
||||
scope_method = ActiveRecord::VERSION::MAJOR >= 3 ? :scope : :named_scope
|
||||
self.send(scope_method, name, scope_options)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class AASM::Base
|
||||
def state_with_scope(name, *args)
|
||||
state_without_scope(name, *args)
|
||||
if @clazz.ancestors.map {|klass| klass.to_s}.include?("ActiveRecord::Base") && !@clazz.respond_to?(name)
|
||||
# puts "setting scope #{@clazz.name}.#{name}"
|
||||
scope_options = {:conditions => { "#{@clazz.table_name}.#{@clazz.aasm_column}" => name.to_s}}
|
||||
scope_method = ActiveRecord::VERSION::MAJOR >= 3 ? :scope : :named_scope
|
||||
@clazz.send(scope_method, name, scope_options)
|
||||
# else
|
||||
# puts "not setting scope #{@clazz.name}.#{name}"
|
||||
end
|
||||
end
|
||||
alias_method :state_without_scope, :state
|
||||
alias_method :state, :state_with_scope
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
ActiveRecord::Schema.define(:version => 0) do
|
||||
|
||||
%w{gates readers writers transients simples thieves localizer_test_models}.each do |table_name|
|
||||
%w{gates readers writers transients simples simple_new_dsls thieves localizer_test_models}.each do |table_name|
|
||||
create_table table_name, :force => true do |t|
|
||||
t.string "aasm_state"
|
||||
end
|
||||
|
|
|
@ -46,11 +46,17 @@ end
|
|||
class Simple < ActiveRecord::Base
|
||||
include AASM
|
||||
aasm_column :status
|
||||
aasm_state :unknown_scope
|
||||
aasm_state :new
|
||||
end
|
||||
|
||||
class SimpleNewDsl < ActiveRecord::Base
|
||||
include AASM
|
||||
aasm :column => :status
|
||||
aasm do
|
||||
state :unknown_scope
|
||||
state :new
|
||||
end
|
||||
end
|
||||
|
||||
class Derivate < Simple
|
||||
|
@ -220,24 +226,36 @@ describe 'Derivates' do
|
|||
end
|
||||
end
|
||||
|
||||
describe AASM::Persistence::ActiveRecordPersistence::NamedScopeMethods do
|
||||
describe "AASM::Persistence::ActiveRecordPersistence::NamedScopeMethods" do
|
||||
|
||||
context "Does not already respond_to? the scope name" do
|
||||
context "Old DSL Does not already respond_to? the scope name" do
|
||||
it "should add a scope" do
|
||||
Simple.should_not respond_to(:unknown_scope)
|
||||
Simple.aasm_state :unknown_scope
|
||||
Simple.should respond_to(:unknown_scope)
|
||||
Simple.unknown_scope.class.should == ActiveRecord::Relation
|
||||
end
|
||||
end
|
||||
|
||||
context "Already respond_to? the scope name" do
|
||||
context "Old DSL Already respond_to? the scope name" do
|
||||
it "should not add a scope" do
|
||||
Simple.aasm_state :new
|
||||
Simple.should respond_to(:new)
|
||||
Simple.new.class.should == Simple
|
||||
end
|
||||
end
|
||||
|
||||
context "New DSL Does not already respond_to? the scope name" do
|
||||
it "should add a scope" do
|
||||
SimpleNewDsl.should respond_to(:unknown_scope)
|
||||
SimpleNewDsl.unknown_scope.class.should == ActiveRecord::Relation
|
||||
end
|
||||
end
|
||||
|
||||
context "New DSL Already respond_to? the scope name" do
|
||||
it "should not add a scope" do
|
||||
SimpleNewDsl.should respond_to(:new)
|
||||
SimpleNewDsl.new.class.should == SimpleNewDsl
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe 'Thieves' do
|
||||
|
|
Loading…
Reference in a new issue