Проверка, существует ли уже экземпляр модели с определенными параметрами

В своем приложении я хочу проверить, существует ли модель концерта с теми же полями исполнителя и даты, что и модель обзора. Если да, то я хочу добавить отзыв о концерте, если нет, то я хочу создать новый концерт и отзыв, потому что у концерта есть_много отзывов и отзывов принадлежит_концерту...

Итак, я написал существует? функция в моем концертном контроллере:

def exists(@artist, @date)?
    @concert_exists = @concerts.find_by_artist_and_date(artist: @artist, date: @date)
    if @concert_exists.nil?
        return false
    else
        return true
    end
  end

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

def create

    if Concert.exists(review_params[:artist], review_params[:date])?
      #add review to this concert 
    else
      @concert = Concert.create(:artist => "artist", :venue => "venue", :date => "2014-2-2")
      @review = @concert.reviews.create(review_params) 
      @concert.artist = @review.artist
      @concert.venue = @review.venue
      @concert.date = @review.date
      @concert.save
    end
end

Я продолжаю получать сообщение об ошибке

"синтаксическая ошибка, неожиданное ключевое слово_другое"

Является ли моя реализация неправильной и есть ли более простой способ сделать то, что я пытаюсь сделать?


person parameter    schedule 06.04.2014    source источник


Ответы (2)


В Rails уже есть метод, который делает это за вас, find_or_create_by. не нужно заново изобретать велосипед

@concert = Concert.find_or_create_by(artist: @artist, venue: "venue", date: @date)
@concert.reviews.create(review_params)
person bjhaid    schedule 07.04.2014
comment
Итак, исходя из этого, как я могу проверить, был ли создан новый концерт или нет? - person parameter; 07.04.2014
comment
@user2739431 user2739431 в документации по рельсам говорится: метод find_or_create_by проверяет, существует ли запись с атрибутами. Если это не так, то вызывается create, вы также можете прочитать документацию, чтобы лучше понять, что он делает, вы также можете включить venue: "venue" в хэш, который вы передаете методу - person bjhaid; 07.04.2014
comment
правильно, но мне нужно знать, создан ли он, чтобы я мог добавить отзыв к уже существующему - person parameter; 07.04.2014
comment
@user2739431 user2739431 Я обновил свой ответ, чтобы отразить именно то, что вы хотите - person bjhaid; 07.04.2014
comment
@user2739431 user2739431 сохраняет @concert?? - person bjhaid; 07.04.2014
comment
это странно, когда я делаю @concert = Concert.find_or_create_by(artist: review_params[:artist], место проведения: review_params[:venue], date: review_params[:date]) я получаю эту ошибку, но если я делаю что-то, чтобы проверить это например, @concert = Concert.find_or_create_by(исполнитель: review_params[:исполнитель], место проведения: asdf, дата: 2-2-2012) я не получаю ошибку... - person parameter; 07.04.2014
comment
и да, это спасает и концерт, и обзор @bjhaid - person parameter; 07.04.2014
comment
@user2739431 user2739431 используйте find_or_create_by! с треском, ActiveRecord вызовет исключение, описывающее, почему объект Concert не создается - person bjhaid; 07.04.2014
comment
и это также создает новый концерт, даже когда я использую то же место исполнителя и дату, что и уже существующие. - person parameter; 07.04.2014
comment
@user2739431 user2739431 Я думаю, вам, вероятно, не нужна дата в хэше, так как это может быть причиной проблемы, вам также следует внимательно посмотреть на запрос, который генерирует ActiveRecord, это даст вам подсказку - person bjhaid; 07.04.2014
comment
Дата не может быть пустой, я делаю (исполнитель: review_params[:artist], место проведения: review_params[:место проведения], дата: review_params[:date]) я также пробовал :date =› review_params[:date] та же проблема, хотя - person parameter; 07.04.2014
comment
как вы ожидаете, что date будет сгенерирован, поскольку вы можете видеть, что review_params[:date] пусто, и это, кажется, вызывает ваши проблемы - person bjhaid; 07.04.2014
comment
да, это пусто, однако исполнитель и место проведения не пусты, поэтому это должно быть проблемой со ссылкой на поле даты. спасибо за всю вашу помощь, я задам этот вопрос отдельным вопросом, вы указали мне правильное направление - person parameter; 07.04.2014

Я думаю, вы хотите написать:

def exists?(@artist, @date)

и:

if Concert.exists?(review_params[:artist], review_params[:date])

Измените положение вопросительного знака.

person Lencho Reyes    schedule 07.04.2014
comment
вы правы, это помогло, но теперь я получаю неправильное количество аргументов (2 вместо 0..1) для строки, если Concert.exists?(review_params[:artist], review_params[:date]) - person parameter; 07.04.2014