Как я могу проверить, существует ли запись в моем БД при публикации с Ajax? - PullRequest
0 голосов
/ 02 июля 2018

Как проверить, существует ли запись в моем БД при публикации с помощью Ajax?

Вот мой код Ajax:

    $.ajax({
        type: "POST",
        url: "team_selections#create",
        data: {
            team_selection: {
                season_id: "1",
                club_id: "1",
                player_id: id,
                fixture_week: "1",
                position: pos
            }
        },
        dataType: "html"
    })

Вот мой код контроллера Rails:

    def create
        if !TeamSelection.where(season_id: params[:season_id], club_id: params[:club_id], player_id: params[:player_id], fixture_week: params[:fixture_week], position: params[:position]).exists?
        TeamSelection.create(selection_params)
        end
    end


private
  def selection_params
    params.require(:team_selection).permit(:season_id, :club_id, :player_id, :fixture_week, :position)
  end

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Вы можете добавить чек с помощью before_action.

before_action :check_record_exists?

def create
  TeamSelection.create(selection_params)
  render_something
end

private

def check_record_exists?
  if TeamSelection.where(selection_params.slice(:season_id, :club_id, :player_id, :fixture_week, :position)).exists?
    render json: { error: 'Record already exists' }
  end
end

def selection_params
  params.require(:team_selection).permit(:season_id, :club_id, :player_id, :fixture_week, :position)
end

ПРИМЕЧАНИЕ: Вам определенно необходимо пройти проверку модели, чтобы предотвратить создание таких записей. Не полагайтесь только на проверки в контроллере или JS.

0 голосов
/ 02 июля 2018

вы можете использовать метод find_or_create_by rails в вашем контроллере. он найдет первую запись с заданными атрибутами или создаст запись с атрибутами, если она не найдена. Этот метод всегда возвращает запись, но если попытка создания была неудачной из-за ошибок валидации, она не будет сохранена, вы получить то, что создает, возвращает в такой ситуации.

def create
  TeamSelection.find_or_create_by(selection_params)
end
0 голосов
/ 02 июля 2018

Как правильно прокомментировал @Jagdeep: добавьте проверку в модель, если вы не хотите, чтобы подобные записи создавались более одного раза. Но здесь контроллер не возвращает никакого ответа типа «Запись уже существует» Замените ваш create метод на

def create
    is_record_present = TeamSelection.where(season_id: params[:season_id], club_id: params[:club_id], player_id: params[:player_id], fixture_week: params[:fixture_week], position: params[:position]).exists?
  if !is_record_present
    TeamSelection.create(selection_params)
  else
    #return respose for example
    render json: {message: 'Record already present'}, status: :bad_request
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...