2010-10-16 3 views
21

у меня есть модель на месте проведения и я хочу сделать этоRails найти или создать на основе двух полей

Venue.find_or_create_by_ 

, но я только хочу новое место, чтобы быть создан, если один с тем же именем и датой еще не существуют

Например

=> Venue(id: integer, location: string, showdate: datetime, created_at: datetime, updated_at: datetime) 

место встречи является уникальным и должен быть создан, если расположение и showdate нет в БД

ответ

41

Вы можете объединить столбцы, используя _and_. Это должно сделать трюк:

Venue.find_or_create_by_location_and_showdate(location, showdate) 
+0

Jeez, Rails и особенно Ruby постоянно меня поражает. Как он знает, что означает эта функция? Есть ли какая-то функция catch_or_create_by_ * catch, которая интерпретирует ее? – Jordan

+7

На самом деле, не смотря на это, я просто посмотрел на источник Rails - Rails использует функцию method_missing, которая выполняет регулярное выражение на вызванном методе и разлагает его. Это гений. Если кому-то еще интересно, проверьте источник active_record/base.rb в источнике Rails. – Jordan

+0

Также приемлемо передавать их в качестве аргументов. Venue.find_or_create_by (: location => location,: showdate => showdate) –

1
my_class = ClassName.find_or_initialize_by_showdate_and_location(showdate,location) 
my_class.update_attributes! 

find_or_initialize метод поиска по названию и местоположению в базе данных. Если запись не существует, она инициализирует новую запись с помощью showdate и location. http://api.rubyonrails.org/classes/ActiveRecord/Base.html Эта ссылка поможет вам найти find_or_initialize и find_or_create.

+0

Вызов '.update_attributes!' Без передачи каких-либо атрибутов довольно бесполезен. '.save!' будет намного лучшим вариантом. И в этом случае реквестер уже сказал, что хочет использовать '.find_or_create', поэтому вам не придется инициализировать и сохранять запись двумя разными шагами. – vonconrad

+0

@vonconrad Я уже предоставил ссылку, которая дает представление об обоих методах. Любой пользователь хотел бы использовать его. Я давал представление, что оба метода доступны. –

+1

с помощью метода find_or_initialize преодолевает проблему попыток создания записи, когда есть проверки, которые не выполняются созданием. например Миграция данных из другой системы. – Gary

7

В рельсах 4 вы могли бы сделать:

Venue.find_or_create_by(location: location, showdate: showdate) 

Гораздо симпатичнее, если вы спросите меня!

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