0
  • Так что я ищу, чтобы переместить функцию find_or_create с моего контроллера на мою модель. Если басистически, если местоположение уже существует, то выберите это, а затем создайте новый. Из немного чтения, я думаю, что перед функцией сохранения это должно сделать, но я не уверен в правильном синтаксисе и не могу найти много примеров в любом месте.

Location.rbМогу ли я найти Find_Or_Create в модели перед сохранением?

before_save :get_locations 

def get_locations 
     Location.find_or_create_by(name: [:name]) 
end 

Вот мой контроллер; он работал нормально при запуске find_or_create здесь.

Locations_controller.rb

def create 
    @location = Location.new(location_params) 

# == worked previously == # 
# @location = Location.find_or_create_by(name: location_params[:name]) 
# == worked previously == #  

    respond_to do |format| 
... 
     end 
    end 

Помощь было бы здорово!

+0

Непонятно, чего вы пытаетесь достичь. Почему вы переместили эту логику в модель - вы не должны этого делать, если эти модели не связаны друг с другом. Также ваш метод 'get_locations' ничего не делает, за исключением того, что тратит время на ненужный sql-запрос, чтобы получить записи, которые отбрасываются позже. Пожалуйста, уточните свой вопрос с более подробной информацией о том, чего вы хотите достичь. – BroiSatse

+0

В модели вы сделали бесконечный цикл, потому что 'create' запускает' before_save' фильтр. – maringan

+0

Возможно, вы ищете обратный вызов 'before_action' для контроллеров? – Iceman

ответ

0

Сначала я попытаюсь угадать, что вы хотите сделать там. Учитывая то, что вы нам дали, вы пытаетесь предотвратить создание нескольких мест с тем же именем, и если пользователь попытается это сделать, найдите его уже созданное место вместо создания нового.

Если это правда, то вы несколько вещей, говоря:

  1. Вам не нужны никакие методы before_create там. Все модели должны иметь вызов validates_uniqueness_of :name, поэтому не было бы двух мест с тем же именем.
  2. Вам нужно переместить эту логику создания обратно в контроллер. Вы можете использовать вызов find_or_initialize_by(name:location_params[:name]) (в случае, если вы хотите что-то сделать с найденной записью впоследствии) или find_or_create_by(name:location_params[:name]) (чтобы создать его сразу).
+0

Привет @Almaron. Это не приведет к ошибке проверки, если я попытаюсь сохранить модель с тем же именем? Я все еще хочу, чтобы подача была успешной, но просто чтобы найти запись, которая в настоящее время существует. Я знаю, что могу это сделать в контроллере - возможно ли это сделать в модели? –

+1

Я думаю, что эта логика принадлежит контроллеру. 'find_or_create_by' должен сделать представление формы успешным. – Almaron

Смежные вопросы