2012-11-23 16 views
7

Używam rails_admin razem z globalizacją3 i nie mogę uzyskać asocjacji przeszukiwania. Oto modele (osoba has_one/belongs_to Nazwa has_many/belongs_to NameTranslation):przeszukiwalne stowarzyszenie rails_admin

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 

Model NameTranslation pochodzi globalize3, zawiera te same atrybuty jak nazwa i last_name (first_name) plus locale i name_id,.

W config/initializers/rails_admin.rb mam

config.model Person do 
    list do 
    field :name do 
     searchable name_translations: :last_name 
    end 
    end 
end 

Następnie w GUI, kiedy dodać filtr na name, otrzymuję:

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 

Oczywiście rails_admin szuka kolumnie o nazwie name_translations.last_name w people zamiast łączenia/w tym names i name_translations - dlaczego?

Co muszę rails_admin zrobić, to ten, pracujący w IRB:

>> Person.joins(name: :name_translations).where('name_translations.last_name like "test"') 

który generuje następujący 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") 

można to zrobić w rails_admin? Dzięki za pomoc ...

+0

Czy zdarzyło Ci się to zrozumieć? Wiem, że minęło trochę czasu. – GreenPlastik

+0

Nie, nie, przepraszam ... – sebastian

Odpowiedz

1

Od this thread, poszedłem za sugestię Nick Roosevelta i to działało na moim przypadku

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 

próbowałem searchable room: :name i to nie działa, ale searchable [{Room => :name}] wydają się działać.

2

Miałem podobny problem z relacją has one. Sposób, w jaki go rozwiązałem, polegał na ustawieniu modelu na default_scope i połączeniu go z powiązaną tabelą (to był jedyny sposób, w jaki mogłem dostać administratora rails, aby połączyć te dwie tabele).

Musiałem również ustawić queryable true w powiązanym polu.

Wyobraźmy sobie, że trzeba było szukać tylko wewnątrz stowarzyszenia i nazwisko, a następnie oto jak to działa:

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 

Jednak trzeba przeszukiwać stowarzyszenia has many i nie wiem, czy to podejście byłoby nadal działa, ale zgaduję:

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 
+0

Mogę sprawdzić, czy działa to w Rails 5, Rails_admin v1.1. Skojarzenie pojawia się na liście pól w filtrze, ale dopóki nie zostaną umieszczone możliwe do przeszukiwania - przeszukiwane linie, po prostu pokazuje całą listę niefiltrowaną. Nie ma błędu ani żadnej wskazówki, co jest nie tak. To sprawia, że ​​filtr/wyszukiwanie działa zgodnie z oczekiwaniami. Możesz zobaczyć pełny przykład pracy tutaj .. https://github.com/dgleba/hrapp361 –

Powiązane problemy