Как добавить условие в гем rails4-autocomplete, что-то вроде (где user_id - user.id) - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть Модель пользователя, и пользователи имеют своих клиентов.В rails4-autocomplete я хочу, чтобы пользователь получал автозаполнение (: name,: address,: zip,: phone ....) только от своих клиентов.Поэтому мне нужно условие где-то в контроллере клиента, где у меня есть:

autocomplete :customer, :customer_name, :extra_data => [:phone, :address, :zip_code, :email]


Я пробовал в модели клиента:

default_scope where(:user_id => current_user.id)

, но rails4-autocomplete больше не работает.

У меня есть customer.rb

    belongs_to :job, optional: true
    belongs_to :user, optional: true

И user.rb

   has_many :customers

И _customers_fields.html.erb:

<%= f.autocomplete_field :customer_name, autocomplete_customer_customer_name_customers_path, 
      :update_elements => { :id => '#id_element',
                            :phone => '#phone-number',
                            :address => '#address_element',
                            :zip_code => '#zip_code_element',
                            :email => '#email_element'
                          }, class: "form-control", :required => true, placeholder: "Company Name", autocomplete: 'off' %>

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

После нескольких дней поиска я нашел решение:

    def get_autocomplete_items(parameters)
      super(parameters).where(:user_id => current_user.id)
    end

возможно, кто-то еще будет использовать это решение в будущем.

0 голосов
/ 01 февраля 2019

Я проверил драгоценный камень, и он не выглядит легким или, по крайней мере, немного хитрым.Существует недокументированная опция where, которую можно использовать, когда вы объявляете функцию автозаполнения на контроллере, но я думаю, что она оценивается в тот момент, и вы ее определяете, я не думаю, что она может быть определена динамически.

Я могу думать о трех вариантах:

1) есть опция "scopes", так что вы можете определить область действия для модели, которая делает where(user_id: <the current user's id>), но вам нужен способ получить идентификатор текущего пользователяиз модели (лично мне это не нравится, это нарушает идею MVC), как это Доступ к current_user в модели

Плюсы: он не исправляет драгоценный камень

Минусы: он нарушает шаблон MVC (но вы можете сделать это, если хотите)

2) добавить небольшое «хакерское» переопределение функции get_autocomplete_items, вызываемой здесь https://github.com/peterwillcn/rails4-autocomplete/blob/440a2f0ba6456f87119675b2b703f56dc54dffec/lib/rails4-autocomplete/autocomplete.rb#L54 чтобы добавить сгенерированную вручную опцию 'where' (хотя она будет работать только для activerecord, код монго на этом драгоценном камне не использует эту опцию 'where')

# after the `autocomplete :customer, :customer_name.... line
alias_method :original_get_autocomplete_items, :get_autocomplete_items # save the original method so you can call it inside your override method

def get_autocomplete_items(*parameters)
  parameters['options'] ||= {} # in case you have no options defined
  parameters['options']['where'] = "user_id: #{current_user.id}" # add the 'where' option to use that undocumented feature
  original_get_autocomplete_items(parameters) # call the original method
end

Плюсы:не нужно ломать схему MVC

Минусы:Параметр 'where' недокументирован и используется только в методе ActiveRecord

3) Просто переопределите метод get_autocomplete_items, определенный на вашем контроллере гемом, скопируйте код из ORM, который вы используете https://github.com/peterwillcn/rails4-autocomplete/tree/master/lib/rails4-autocomplete/orm и просто добавьте необходимое условие where

Плюсы: нет необходимости ломать скороговорку MVC, нет необходимости использовать недокументированную функцию

Минусы: вы переопределяете весь метод, если драгоценный камень изменяется при обновлении, вам нужно проверить, работает ли пользовательский метод с этими изменениями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...