rails_admin searchable association - rails-admin

I am using rails_admin together with globalize3 and cannot get searchable associations to work. Here are the models (Person has_one/belongs_to Name has_many/belongs_to NameTranslation):
class Person < ActiveRecord::Base
has_one :name, inverse_of: :person
end
class Name < ActiveRecord::Base
belongs_to :person, inverse_of: :name
translates :first_name, :last_name
has_many :name_translations, inverse_of: :name, dependent: :destroy
end
class NameTranslation < ActiveRecord::Base
belongs_to :name, inverse_of: :name_translations
end
The NameTranslation model is coming from globalize3, it contains the same attributes as name (first_name and last_name) plus locale and name_id,.
In config/initializers/rails_admin.rb I have
config.model Person do
list do
field :name do
searchable name_translations: :last_name
end
end
end
Then, in the GUI, when I add a filter on name, I get:
SQLite3::SQLException: no such column: name_translations.last_name: SELECT "people".* FROM "people" WHERE (((name_translations.last_name LIKE '%freud%'))) ORDER BY people.id desc LIMIT 20 OFFSET 0
Obviously, rails_admin is looking for a column named name_translations.last_name in people instead of joining/including names and name_translations - why?
What I need rails_admin to do is this, working in irb:
>> Person.joins( name: :name_translations ).where('name_translations.last_name like "test"')
which generates the following SQL:
SELECT "people".* FROM "people" INNER JOIN "names" ON "names"."person_id" = "people"."id" INNER JOIN "name_translations" ON "name_translations"."name_id" = "names"."id" WHERE (name_translations.last_name like "test")
Can this be done in rails_admin? Thanks for your help...

From this thread, I followed Nick Roosevelt's suggestion and it worked for my case
class Room < ActiveRecord:Base
has_many :time_slots
end
class TimeSlot < ActiveRecord::Base
belongs_to :room
rails_admin do
list do
field :day do
searchable true
end
# field :room do
# searchable room: :name
# end
field :room do
searchable [{Room => :name}]
queryable true
end
end
end
end
I tried searchable room: :name and it was not working, but searchable [{Room => :name}] seem to make it work.

I had a similar problem with a has one relationship.
The way I solved it was to set a default_scope on the model and join it with the associated table (it is was the only way I could get rails admin to join these two tables).
I also had to set queryable true on the associated field.
Imagine that you had to search only inside the name association, then here's how it would work:
class Person < ActiveRecord::Base
has_one :name, inverse_of: :person
default_scope { eager_load(:name) }
end
config.model Person do
list do
field :name do
queryable true
searchable [:column1, :column2, ..]
end
end
end
However, you need to search through the has many association and I don't know whether that approach would still work, but here's a guess:
class Person < ActiveRecord::Base
has_one :name, inverse_of: :person
has_many :name_translations, through: :name
default_scope { eager_load(:name_translations) }
end
config.model Person do
list do
field :name_translations do
queryable true
searchable :last_name
end
end
end

Related

Rails Admin filtering multiselect

I have a model with these associations:
has_many :ad_places, dependent: :destroy
has_many :places, through: :ad_places
And in my Rails Admin initializer:
edit do
field :places do
inline_add false
associated_collection_cache_all true
associated_collection_scope do
Proc.new do |scope|
scope = scope.order(:place_on_page)
end
end
end
field :html, :text
field :document
end
But my entries on the multiselect are not ordered by place_on_page, the request that does Rails Admin is ORER by places.id desc
It's basically the same configuration than this guy that's been fixed by this fix except that it doesn't work for me.
Do I miss something?
Check the logs on development to see what SQL is being generated, probably there's another ordering somewhere. to fix that try:
scope = scope.reorder(:place_on_page)

ActiveAdmin: Child object claims to not have method parent_object_id

I have solved this issue before but the solution currently escapes me.
I have two Models FlsCenter and Airport. FlsCenters has_many airports.
In active admin I am creating a newe Airport object. however when I press New Airport in the dashboard, I get the following error:
undefined method `fls_center_id' for #<Airport:0x007fbf5457bf00>
Here are the model definitions for both models:
class Airport < ActiveRecord::Base
belongs_to :fls_center
end
class FlsCenter < ActiveRecord::Base
has_many :housing_options
has_many :airports
has_many :programs
end
Here is my Schema.rb
create_table "airports", force: true do |t|
t.string "name"
t.integer "pick_up_cost"
t.datetime "created_at"
t.datetime "updated_at"
end
notice that there is not field fls_center_id. Doesn't rails take care of that via belongs_to has_many? How come my schema does not reflect my models?
I ran rake db:migrate. Also for reference I have included fls_center_id as a permitted param to active admin.
Rails won't create database columns for you just from setting up the model. You can add another migration to add this new field. Try:
rails g migration add_fls_center_to_airports fls_center:reference:index
And then run rake db:migrate.

make column of associated resource in index table non-linked

Okay, using ActiveAdmin (0.6.3) and am able to use the following code to get a caller's location attribute to appear in the table of callers. The name of each location appears as a link to the "show" action for the location. The "show" action and result is not useful for my application. I want to remove the link but keep the text. Help? Thanks :)
ActiveAdmin.register Caller do
index do
column 'Location', :location, :sortable => 'locations.name'
end
controller do
def scoped_collection
resource_class.includes(:location)
end
end
end
class Caller < ActiveRecord::Base
attr_accessible :active, :assignedname, :callingnumber, :description, :location_id, :lookupcount, :lastlookuptime
belongs_to :location
end
class Location < ActiveRecord::Base
attr_accessible :active, :description, :name, :callers_attributes
has_many :callers, dependent: :destroy
end
Try this.
index do
column 'Location', :sortable => 'locations.name' do |caller|
caller.location.name
end
end

uninitialized constant [Active Admin]

I have error message "uninitialized constant Slideapp::Appinfos"
My database have 2 table is appinfo and slideapp.This is code in my model
class Appinfo < ActiveRecord::Base
has_many :slideapps
accepts_nested_attributes_for :slideapps
end
class Slideapp < ActiveRecord::Base
belongs_to :appinfos
end
How do I fix this problem ?
This is unrelated to ActiveAdmin.
Your belongs_to should use the singular form of Appinfo:
class Slideapp < ActiveRecord::Base
belongs_to :appinfo # <= use of singular Appinfo
end
As it is now Rails is trying to autoload the class Appinfos, which doesn't exist.

Thinking Sphinx: Multiple indices for single model?

I'm searching in two different modes using Thinking Sphinx:
Full search on a single model for normal search functionality
Full search across all models for autocomplete dropdown functionality
For the sake of this question, let's say I have a Person and a Country model.
When performing regular searches, I want to fetch all people who's name of country name matches the search string. To achieve this, I have added an index on the countries name in the Person index. All well so far.
When searching to populate my autocomplete dropdown, I want to show all countries and all people matching my search string. Here the problem shows up. When doing an Application-Wide search, I now get:
all countries whose name match my search string
all doctors whose name match my search string, and unfortunately...
all doctors who belongs to a country that matches the search string.
The last part makes for some really confusing autocomplete results for the user. Is there any simple way for me to avoid this by using built-in functionality, for example like having two indices on the Person model, and choose which one to use for each kind of search?
I supposed that your models are like the below:
class Person < ActiveRecord::Base
belongs_to :country
define_index
indexes :name
indexes country(:name), :as => country_name
end
end
class Country < ActiveRecord::Base
has_many :people # has_many :persons # depending on your singular/plural case
define_index
indexes :name
end
end
So, you can get the result without having 3(third condition) by executing the query:
ThinkingSphinx.search :conditions => {:name => params[:q]}, :classes => [Person, Country]
But, if you want to create multiple indexes on a model it can be done like the sample below:
class Person < ActiveRecord::Base
belongs_to :country
define_index :my_first_in do
indexes :name
indexes country(:name)
end
define_index :my_second_in do
indexes :name
end
end
sphinx v3 syntax for the answer above:
ThinkingSphinx::Index.define :country, name: "my_first_in", with: :active_record
indexes name
end

Resources