8

rails_admin を globalize3 と一緒に使用していますが、検索可能な関連付けを機能させることができません。モデルは次のとおりです (Person 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

モデルはglobalize3から来ており、 name ( and ) plus and , とNameTranslation同じ属性が含まれています。first_namelast_namelocalename_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 は join/includeではなくname_translations.last_nameinという名前の列を探していますが、なぜでしょうか?peoplenamesname_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、モデルに を設定し、関連付けられたテーブルと結合することでした (レール管理者にこれら 2 つのテーブルを結合させる唯一の方法でした)。

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 に答える