#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 мог бы справиться с этой ситуацией без изменения кода. Но пока я могу жить с этим