Commit 857ed343 by Ryan Bigg

Merge pull request #247 from codeodor/rails4

Fix for #122, #121 and #175 on Rails 4 branch
parents fcdcc7a9 7232e2f5
...@@ -154,7 +154,7 @@ module Paranoia ...@@ -154,7 +154,7 @@ module Paranoia
association_find_conditions = { association_foreign_key => self.id } association_find_conditions = { association_foreign_key => self.id }
end end
association_class = Object.const_get(association_class_name) association_class = association_class_name.constantize
if association_class.paranoid? if association_class.paranoid?
association_class.only_deleted.where(association_find_conditions).first.try!(:restore, recursive: true) association_class.only_deleted.where(association_find_conditions).first.try!(:restore, recursive: true)
end end
...@@ -237,3 +237,16 @@ class ActiveRecord::Base ...@@ -237,3 +237,16 @@ class ActiveRecord::Base
end end
require 'paranoia/rspec' if defined? RSpec require 'paranoia/rspec' if defined? RSpec
module ActiveRecord
module Validations
class UniquenessValidator < ActiveModel::EachValidator
protected
def build_relation_with_paranoia(klass, table, attribute, value)
relation = build_relation_without_paranoia(klass, table, attribute, value)
relation.and(klass.arel_table[klass.paranoia_column].eq(nil))
end
alias_method_chain :build_relation, :paranoia
end
end
end
...@@ -28,7 +28,7 @@ def setup! ...@@ -28,7 +28,7 @@ def setup!
'fail_callback_models' => 'deleted_at DATETIME', 'fail_callback_models' => 'deleted_at DATETIME',
'related_models' => 'parent_model_id INTEGER, parent_model_with_counter_cache_column_id INTEGER, deleted_at DATETIME', 'related_models' => 'parent_model_id INTEGER, parent_model_with_counter_cache_column_id INTEGER, deleted_at DATETIME',
'asplode_models' => 'parent_model_id INTEGER, deleted_at DATETIME', 'asplode_models' => 'parent_model_id INTEGER, deleted_at DATETIME',
'employers' => 'deleted_at DATETIME', 'employers' => 'name VARCHAR(32), deleted_at DATETIME',
'employees' => 'deleted_at DATETIME', 'employees' => 'deleted_at DATETIME',
'jobs' => 'employer_id INTEGER NOT NULL, employee_id INTEGER NOT NULL, deleted_at DATETIME', 'jobs' => 'employer_id INTEGER NOT NULL, employee_id INTEGER NOT NULL, deleted_at DATETIME',
'custom_column_models' => 'destroyed_at DATETIME', 'custom_column_models' => 'destroyed_at DATETIME',
...@@ -685,6 +685,19 @@ class ParanoiaTest < test_framework ...@@ -685,6 +685,19 @@ class ParanoiaTest < test_framework
# essentially, we're just ensuring that this doesn't crash # essentially, we're just ensuring that this doesn't crash
end end
def test_validates_uniqueness_only_checks_non_deleted_records
a = Employer.create!(name: "A")
a.destroy
b = Employer.new(name: "A")
assert b.valid?
end
def test_validates_uniqueness_still_works_on_non_deleted_records
a = Employer.create!(name: "A")
b = Employer.new(name: "A")
refute b.valid?
end
def test_i_am_the_destroyer def test_i_am_the_destroyer
expected = %Q{ expected = %Q{
Sharon: "There should be a method called I_AM_THE_DESTROYER!" Sharon: "There should be a method called I_AM_THE_DESTROYER!"
...@@ -909,6 +922,7 @@ end ...@@ -909,6 +922,7 @@ end
class Employer < ActiveRecord::Base class Employer < ActiveRecord::Base
acts_as_paranoid acts_as_paranoid
validates_uniqueness_of :name
has_many :jobs has_many :jobs
has_many :employees, :through => :jobs has_many :employees, :through => :jobs
end end
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment