diff --git a/lib/rails_admin/config/fields/base.rb b/lib/rails_admin/config/fields/base.rb index e33ca3066a..53a71128e1 100644 --- a/lib/rails_admin/config/fields/base.rb +++ b/lib/rails_admin/config/fields/base.rb @@ -88,7 +88,7 @@ def virtual? table_name, column = f.split '.' type = nil elsif f.is_a?(Hash) # => - am = AbstractModel.new(f.keys.first.to_s.classify) + am = f.keys.first.is_a?(Class) && AbstractModel.new(f.keys.first) table_name = am && am.model.table_name || f.keys.first column = f.values.first property = am && am.properties.find{ |p| p[:name] == f.values.first.to_sym } diff --git a/lib/rails_admin/config/fields/types/belongs_to_association.rb b/lib/rails_admin/config/fields/types/belongs_to_association.rb index 6d2e22261c..54301c3f52 100644 --- a/lib/rails_admin/config/fields/types/belongs_to_association.rb +++ b/lib/rails_admin/config/fields/types/belongs_to_association.rb @@ -18,7 +18,7 @@ class BelongsToAssociation < RailsAdmin::Config::Fields::Association end register_instance_option :searchable do - @searchable ||= associated_model_config.abstract_model.properties.map{ |p| p[:name] }.include?(associated_model_config.object_label_method) ? [associated_model_config.object_label_method, {self.abstract_model.model.name => self.method_name}] : {self.abstract_model.model.name => self.method_name} + @searchable ||= associated_model_config.abstract_model.properties.map{ |p| p[:name] }.include?(associated_model_config.object_label_method) ? [associated_model_config.object_label_method, {self.abstract_model.model => self.method_name}] : {self.abstract_model.model => self.method_name} end register_instance_option :partial do diff --git a/spec/lib/fields_spec.rb b/spec/lib/fields_spec.rb new file mode 100644 index 0000000000..3c25aba4ac --- /dev/null +++ b/spec/lib/fields_spec.rb @@ -0,0 +1,82 @@ +require 'spec_helper' + +describe RailsAdmin::Config::Fields::Base do + describe '#searchable_columns' do + describe 'for belongs_to fields' do + it "should find label method on the opposite side for belongs_to associations by default" do + RailsAdmin.config(Team).fields.find{|f| f.name == :division}.searchable_columns.should == [{:column=>"divisions.name", :type=>:string}, {:column=>"teams.division_id", :type=>:integer}] + end + + it "should search on opposite table for belongs_to" do + RailsAdmin.config(Team) do + field :division do + searchable :custom_id + end + end + RailsAdmin.config(Team).fields.find{|f| f.name == :division}.searchable_columns.should == [{:column=>"divisions.custom_id", :type=>:integer}] + end + + it "should search on asked table with model name" do + RailsAdmin.config(Team) do + field :division do + searchable League => :name + end + end + RailsAdmin.config(Team).fields.find{|f| f.name == :division}.searchable_columns.should == [{:column=>"leagues.name", :type=>:string}] + end + + it "should search on asked table with table name" do + RailsAdmin.config(Team) do + field :division do + searchable :leagues => :name + end + end + RailsAdmin.config(Team).fields.find{|f| f.name == :division}.searchable_columns.should == [{:column=>"leagues.name", :type=>:string}] + end + end + + describe 'for basic type fields' do + + it 'should use base table and find correct column type' do + RailsAdmin.config(FieldTest).fields.find{|f| f.name == :text_field}.searchable_columns.should == [{:column=>"field_tests.text_field", :type=>:text}] + RailsAdmin.config(FieldTest).fields.find{|f| f.name == :integer_field}.searchable_columns.should == [{:column=>"field_tests.integer_field", :type=>:integer}] + end + + it 'should be customizable to another field on the same table' do + RailsAdmin.config(FieldTest) do + field :time_field do + searchable :date_field + end + end + RailsAdmin.config(FieldTest).fields.find{|f| f.name == :time_field}.searchable_columns.should == [{:column=>"field_tests.date_field", :type=>:date}] + end + + it 'should be customizable to another field on another table with :table_name' do + RailsAdmin.config(FieldTest) do + field :string_field do + searchable :nested_field_tests => :title + end + end + RailsAdmin.config(FieldTest).fields.find{|f| f.name == :string_field}.searchable_columns.should == [{:column=>"nested_field_tests.title", :type=>:string}] + end + + it 'should be customizable to another field on another model with ModelClass' do + RailsAdmin.config(FieldTest) do + field :string_field do + searchable NestedFieldTest => :title + end + end + RailsAdmin.config(FieldTest).fields.find{|f| f.name == :string_field}.searchable_columns.should == [{:column=>"nested_field_tests.title", :type=>:string}] + end + end + + describe 'for mapped fields' do + + it 'should find the underlying column on the base table' do + RailsAdmin.config(FieldTest).fields.find{|f| f.name == :paperclip_asset}.searchable_columns.should == [{:column=>"field_tests.paperclip_asset_file_name", :type=>:string}] + RailsAdmin.config(FieldTest).fields.find{|f| f.name == :dragonfly_asset}.searchable_columns.should == [{:column=>"field_tests.dragonfly_asset_name", :type=>:string}] + RailsAdmin.config(FieldTest).fields.find{|f| f.name == :carrierwave_asset}.searchable_columns.should == [{:column=>"field_tests.carrierwave_asset", :type=>:string}] + end + end + end +end \ No newline at end of file