2010-01-31 3 views
0

Есть ли способ сохранить объект, но вернуть объект, если он не прошел проверку validation_of для данного поля? Например, у меня есть следующий:Обратный объект после проверки Неисправность

class User 
    has_many :words 
... 
end 

class Word 
    belongs_to :user 
    validates_uniqueness_of :title 
... 
end 

И у меня есть ситуации, когда я хочу либо вернуть объект Word, если пользователь уже сохранил это слово, или вернуть вновь сохраненный объект слова. Я окажусь проверить, если объект слово существует через мой собственный поиск, а затем выполнять свои ворота, если нет:

existing_word = find_by_word_and_user_id(word, user) 
!existing_word.nil? ? existing_word : user.words.create({:word => word}) 

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

ответ

1

Вы могли бы быть заинтересованы в #find_or_create_by_word_and_user, другое магических методы ActiveRecord в:

obj = Word.find_or_create_by_word_and_user(word, user) 

# Preferred way 
obj = user.words.find_or_create_by_word(word) 

Это будет делать 2 запросов к базе данных в любом случае: нет никакого пути вокруг этого. Кроме того, если ваш экземпляр Word имеет больше проверок, которые вы нам показали, создание завершится неудачно, потому что #find_or_create_by не позволяет передавать больше атрибутов.

Для получения подробной информации о методах динамического поиска найдите «Динамические искатели на основе атрибутов» на странице http://api.rubyonrails.org/classes/ActiveRecord/Base.html.

1

Вы можете высыхают это утверждение немного, просто говоря:

find_by_word_and_user(word, user) || user.words.create(:word => word) 

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

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

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