rails_admin поиск по вложенной ассоциации принадлежит

#ruby-on-rails #rails-admin

Вопрос:

У меня есть модель:

 class TenantReference < ActiveRecord::Base
  include TenantReferenceAdmin
  belongs_to :tenant, inverse_of: :reference
  default_scope { eager_load(:tenant) }
end
 

и модель арендатора:

 class Tenant < ActiveRecord::Base
  default_scope { eager_load(:user) }
  belongs_to :user
end
 

и модель пользователя:

 class User < ActiveRecord::Base
  has_many :tenants, :foreign_key => :user_id, class_name: 'Tenant'
end
 

и, наконец, файл администратора TenantReferenceAdmin rails:

 module TenantReferenceAdmin
  extend ActiveSupport::Concern

  included do
    rails_admin do
      list do
        field :tenant do
          filterable true
          queryable true
          searchable [ :first_name, :last_name]
        end
    ...
 

я пытаюсь добиться того, чтобы на странице администратора tenantreference пользователь мог искать объекты TenantReference по имени или фамилии пользователя через их ссылку на арендатора.

Эта конфигурация создает запрос postgresql, такой как:

 SELECT  "tenant_references"."id" AS t0_r0, .... "tenants"."id" AS t1_r0, ......
FROM "tenant_references" LEFT OUTER JOIN "tenants" ON "tenants"."id" = "tenant_references"."tenant_id" 
WHERE ((tenants.first_name ILIKE '%query%') 
  OR (tenants.last_name ILIKE '%query%') 
ORDER BY tenant_references.id desc LIMIT 20 OFFSET 0)
 

что не работает, потому что имя/фамилия на самом деле являются полями пользователя, а не арендатора.

как я мог это исправить?

Спасибо,

Комментарии:

1. Разве вам не нужно что-то подобное searchable: [{User => :first_name, :last_name}] ? Я не знаю RailsAdmin и ничего не вижу в документах об этой searchable опции, хотя!

2. спасибо, я пробовал, но не смог найти способ включить в соединение модель пользователя, я ожидаю, что будет дополнительное соединение, например: JOIN users ON users.id = tenants.user_id но поскольку у tenant_references нет прямого belongs_to :user, through: :tenant , я не вижу способа это сделать. Проблема в том, что там есть СОЕДИНЕНИЕ, при этом нет проблем с сортировкой «ГДЕ».

3. Поэтому не могли бы вы добавить has_many through ссылку «От пользователя» в ссылки арендатора через Арендатора? Тогда Rails будет знать об этой прямой связи, которую вы хотите использовать.

4. спасибо, действительно, добавление has_one заставило его работать нормально, описав решение в ответе

Ответ №1:

Проблема, по-видимому, в том, что администратор rails добавляет JOIN в запрос только в том случае, если текущая модель имеет прямую ссылку ( has_many , has_one …) на другую модель для поиска. и он присоединяется к нему, если соответствующее поле помечено как queryable true .

поэтому я изменил добавление в модель ссылок этой строки:

has_one :user, through: :tenant

Затем я создал невидимое поле списка:

     field :user do
      visible false
      queryable true
      searchable [{User => :first_name}, {User => :last_name}]
    end
 

это можно найти, но оно не отображается в списке.

это решило проблему, я не считаю это идеальным, так как мне пришлось изменить свою модель, чтобы иметь возможность выполнять поиск rails_admin, когда rails_admin мог бы справиться с этой ситуацией без изменения кода. Но пока я могу жить с этим