8

我将 rails_admin 与 globalize3 一起使用,无法使可搜索的关联起作用。以下是模型(人 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

NameTranslation模型来自 globalize3,它包含与 name ( first_nameand last_name) plus localeand相同的属性name_id

config/initializers/rails_admin.rb我有

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

然后,在 GUI 中,当我在 上添加过滤器时name,我得到:

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

显然,rails_admin 正在寻找一个名为name_translations.last_nameinpeople而不是加入/包含的列,names并且name_translations- 为什么?

我需要 rails_admin 做的是,在 irb 工作:

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

生成以下 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")

这可以在 rails_admin 中完成吗?谢谢你的帮助...

4

2 回答 2

5

这个线程中,我遵循了尼克罗斯福的建议,它适用于我的情况

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

我试过了,但它searchable room: :name不起作用,但searchable [{Room => :name}]似乎让它起作用。

于 2016-05-09T10:12:45.183 回答
3

我的关系也有类似的问题has one。我解决它的方法是default_scope在模型上设置 a 并将其与关联的表连接(这是我可以让 rails admin 连接这两个表的唯一方法)。

我还必须queryable true在相关字段上进行设置。

想象一下,您只需要在名称关联中进行搜索,那么它的工作方式如下:

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

但是,您需要搜索has many关联,我不知道这种方法是否仍然有效,但这里有一个猜测:

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
于 2017-04-03T12:08:03.233 回答