2011-08-23 12 views
7

Czy można pominąć sprawdzanie poprawności za pomocą dynamicznego wyszukiwania/tworzenia według metody?Jak pominąć walidacje w/find_or_create_by_?

Na przykład regularne zapisać można zrobić coś takiego:

p = Post.new 
p.title = nil 
p.body = nil 
p.save(:validate => false) 

Chciałbym zrobić to samo z find_or_create_by_title.

Odpowiedz

13

To dosnt wyglądało na to możliwe dzięki code in Rails right now, jednak możesz mieć więcej szczęścia, gdy jesteś trochę bardziej grzeczny w pisaniu kodu. Możesz użyć find_or_initialize_by_, który tworzy nowy obiekt, ale go nie zapisuje. Można połączyć zapisać z opcji niestandardowych, również w documentation mają schludny wykazanie, że jest trudno znaleźć, więc będę to go poniżej:

# No 'Winter' tag exists 
winter = Tag.find_or_initialize_by_name("Winter") 
winter.new_record? # true 

Powodzenia i daj mi znać, jeśli potrzebujesz więcej wskazówek w właściwy kierunek.

+0

Wielkie dzięki. Tak właśnie poszedłem! Doceń, że poświęcasz czas na odpowiedź. –

1

W niektórych przypadkach nie przyda się i należy pominąć sprawdzanie poprawności za pomocą find_or_create_by.

W tym celu można skorzystać z poniższego alternatywnego sposobu przepływu i ROR:

  • zaktualizować swój wzór takiego:

klasa post < ActiveRecord :: Base

attr_accessor: skip_validation
belongs_to: user
validates_presence_of: title, , chyba że:: skip_validation

koniec

  • Można go używać teraz tak:
    Post.where(user_id: self.id).first_or_create!(skip_validation: true)

Użyłem first_or_create zamiast find_or_create_by tutaj. Możesz przekazać więcej nazw kolumn i wartości, a twoja walidacja nie będzie działać z tym.

  • Można nadal bez zmian do końca silnej parametrów i nie ma potrzeby, aby umożliwić to „skip_validation” tak to będzie działać z walidacji podczas dodawania wpisów.

  • Za pomocą tego można go używać z walidacją i bez weryfikacji, przekazując parametr.