rails_admin 搜索嵌套的 belongs_to 关联

rails_admin search through nested belongs_to association

我有一个模型:

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 管理页面中,用户可以通过用户的 first_name 或 last_name 通过他们的租户参考来搜索 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)

这不起作用,因为 first/last_name 实际上是用户字段,而不是租户字段。

我该如何解决这个问题?

谢谢,

问题似乎是 rails 管理员仅在当前模型具有直接 link(has_manyhas_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 本来可以处理这种情况无需更改代码。但现在我可以忍受这个