Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions lib/active_hash/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ def add_default_value field_name, default_value
end

def define_getter_method(field, default_value)
unless instance_methods.include?(field.to_sym)
unless instance_methods(false).include?(field.to_sym)
define_method(field) do
attributes[field].nil? ? default_value : attributes[field]
end
Expand All @@ -291,7 +291,7 @@ def define_getter_method(field, default_value)

def define_setter_method(field)
method_name = :"#{field}="
unless instance_methods.include?(method_name)
unless instance_methods(false).include?(method_name)
define_method(method_name) do |new_val|
@attributes[field] = new_val
end
Expand All @@ -302,7 +302,7 @@ def define_setter_method(field)

def define_interrogator_method(field)
method_name = :"#{field}?"
unless instance_methods.include?(method_name)
unless instance_methods(false).include?(method_name)
define_method(method_name) do
send(field).present?
end
Expand All @@ -313,7 +313,7 @@ def define_interrogator_method(field)

def define_custom_find_method(field_name)
method_name = :"find_by_#{field_name}"
unless singleton_methods.include?(method_name)
unless singleton_methods(false).include?(method_name)
the_meta_class.instance_eval do
define_method(method_name) do |*args|
args.extract_options!
Expand All @@ -328,9 +328,9 @@ def define_custom_find_method(field_name)

def define_custom_find_all_method(field_name)
method_name = :"find_all_by_#{field_name}"
unless singleton_methods.include?(method_name)
unless singleton_methods(false).include?(method_name)
the_meta_class.instance_eval do
unless singleton_methods.include?(method_name)
unless singleton_methods(false).include?(method_name)
define_method(method_name) do |*args|
args.extract_options!
identifier = args[0]
Expand Down
68 changes: 42 additions & 26 deletions spec/active_hash/base_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1172,41 +1172,57 @@ class Region < ActiveHash::Base
end
end

it "doesn't override methods already defined" do
Country.class_eval do
class << self
def find_by_name(name)
"find_by_name defined manually"
context "when Country already defined name methods" do
before do
Country.class_eval do
class << self
def find_by_name(name)
"find_by_name defined manually"
end

def find_all_by_name(name)
"find_all_by_name defined manually"
end
end

def find_all_by_name(name)
"find_all_by_name defined manually"
def name
"name defined manually"
end
end

def name
"name defined manually"
end

def name?
"name? defined manually"
def name?
"name? defined manually"
end
end
end

Country.find_by_name("foo").should == "find_by_name defined manually"
Country.find_all_by_name("foo").should == "find_all_by_name defined manually"
Country.new.name.should == "name defined manually"
Country.new.name?.should == "name? defined manually"
it "doesn't override methods already defined" do
Country.find_by_name("foo").should == "find_by_name defined manually"
Country.find_all_by_name("foo").should == "find_all_by_name defined manually"
Country.new.name.should == "name defined manually"
Country.new.name?.should == "name? defined manually"

Country.data = [
{:name => "foo"}
]
Country.data = [
{:name => "foo"}
]

Country.all
Country.find_by_name("foo").should == "find_by_name defined manually"
Country.find_all_by_name("foo").should == "find_all_by_name defined manually"
Country.new.name.should == "name defined manually"
Country.new.name?.should == "name? defined manually"
end

Country.all
Country.find_by_name("foo").should == "find_by_name defined manually"
Country.find_all_by_name("foo").should == "find_all_by_name defined manually"
Country.new.name.should == "name defined manually"
Country.new.name?.should == "name? defined manually"
it "allow override methods already defined in super class" do
class Japan < Country
field :name
add name: "bar"
end
Japan.first.name.should == "bar"
Japan.find_by_name("bar").should be_a(Japan)
Japan.find_all_by_name("bar").should be_a(Array)
Japan.first.name.should == "bar"
Japan.first.name?.should be_truthy
end
end
end

Expand Down