Поддерживает ли Ransack в своих поисках те же полиморфные ассоциации владения_, что и MetaSearch?
Я перехожу с гема MetaSearch на гем Ransack для обновления до Rails 3.1, и у меня возникают проблемы с поиском полиморфных ассоциаций. Существующий синтаксис MetaSearch не работает для Ransack, но я не смог найти никакой документации, упоминающей какие-либо изменения синтаксиса. Или эта функция поддерживается в Ransack.
Например, со страницы MetaSearch github, предоставлены следующие классы:
class Article < ActiveRecord::Base
has_many :comments, :as => :commentable
end
class Post < ActiveRecord::Base
has_many :comments, :as => :commentable
end
class Comment < ActiveRecord::Base
belongs_to :commentable, :polymorphic => true
validates_presence_of :body
end
вы можете создать поле поиска в вашей форме следующим образом (это соглашение, позаимствованное у Searchlogic):
<%= f.text_field :commentable_article_type_body_contains %>
Я использую этот тип синтаксиса, который отлично работает в MetaSearch, но с Ransack мое приложение выдает исключение, когда параметр запроса содержит это поле. Исключение составляет:
ActiveRecord::EagerLoadPolymorphicError (Can not eagerly load the polymorphic association :ownable)
Кто-нибудь знает, как сделать этот тип поиска в Ransack?
1 ответ
Я боролся с той же проблемой (хотя моя ошибка была другой). Я думаю, что ваш код должен быть:
<%= f.text_field :commentable_of_Article_type_body_contains %>
обратите внимание на заглавную
Это сработало для меня. Вы можете проверить тесты Эрни на полиморфные ассоциации здесь (это последний файл на странице)
В моем конкретном случае я продолжал получать NameError (неинициализированная константа) даже при использовании соответствующего синтаксиса ransack.
Посмотреть
# NAME ERROR
<div class="form-group col-xs-12 col-sm-12 col-md-4 col-lg-4">
<%= f.label :identifiable_of_Drug_type_name_or_description_cont %>
<%= f.search_field :identifiable_of_Drug_type_name_or_description_cont, class: 'form-control form-control-bb' %>
</div>
Я смог исправить это, используя псевдоним ransack:
Модель
class Identifier < ApplicationRecord
# note the missing 'cont' predicate
ransack_alias :name_or_description, :identifiable_of_Drug_type_name_or_description
end
Посмотреть
# NO ERROR
<div class="form-group col-xs-12 col-sm-12 col-md-4 col-lg-4">
# 'cont' predicate is declared in the view
<%= f.label :name_or_description_cont %>
<%= f.search_field :name_or_description_cont, class: 'form-control form-control-bb' %>
</div>