2014-09-22 1 views
3

Когда один класс имеет более одной ассоциации belongs_to другому классу, RailsAdmin генерирует неправильный запрос, когда пользователь пытается фильтровать вторую ассоциацию. Практический пример:Фильтры RailsAdmin не работают, когда есть несколько соединений на одной модели

class Issue < ActiveRecord::Base 
    belongs_to(:author, class_name: 'Worker', foreign_key: 'author_id', inverse_of: :authored_issues) 
    belongs_to(:assignee, class_name: 'Worker', foreign_key: 'assignee_id', inverse_of: :assigned_issues) 
end 

class Worker < ActiveRecord::Base 
    has_many(:authored_issues, class_name: 'Issue', foreign_key: 'author_id', inverse_of: :author) 
    has_many(:assigned_issues, class_name: 'Issue', foreign_key: 'assignee_id', inverse_of: :assignee) 
end 

При доступе /admin/issues и пытаются фильтровать цессионария SQL генерироваться производит неправильные результаты, потому что он не знает, стол был совмещенным и фильтры автора вместо:

SELECT "issues"."id" AS t0_r0, "issues"."title" AS t0_r1, "issues"."description" AS t0_r2, "issues"."author_id" AS t0_r3, "issues"."assignee_id" AS t0_r4, "issues"."created_at" AS t0_r5, "issues"."updated_at" AS t0_r6, "users"."id" AS t1_r0, "users"."name" AS t1_r1, "users"."created_at" AS t1_r2, "users"."updated_at" AS t1_r3, "assignees_issues"."id" AS t2_r0, "assignees_issues"."name" AS t2_r1, "assignees_issues"."created_at" AS t2_r2, "assignees_issues"."updated_at" AS t2_r3 
FROM "issues" 
LEFT OUTER JOIN "users" ON "users"."id" = "issues"."author_id" 
LEFT OUTER JOIN "users" "assignees_issues" ON "assignees_issues"."id" = "issues"."assignee_id" 
WHERE ((LOWER(users.name) LIKE '%asdf%')) ORDER BY issues.id desc LIMIT 20 OFFSET 0 

Как чтобы исправить это? пункт WHERE должен использовать "assignees_issues".name. Это ошибка в ActiveRecord, RailsAdmin или моем приложении?

ответ

3

Мне пришлось использовать RailsAdmin DSL, чтобы указать новое имя таблицы с псевдонимом. В основном:

config.model 'Issue' do 
    list do 
     field :title 
     field :description 
     field :author 
     field :assignee do 
     searchable do 
      {'assignees_issues' => 'name'} 
     end 
     end 
    end 
    end 
+0

Это правильное решение. Я рекомендую посмотреть, какой запрос RailsAdmin создает, замените таблицу блоков поиска на что-то бессмысленное, чтобы определить, что именно на самом деле вам нужно изменить. – corvuszero