Поддерживает ли 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>
Другие вопросы по тегам