2016-04-19 1 views
-3

Ich habe Gender und basierend auf Geschlecht Name Kategorie und Unterkategorien erstellen.Rails find_by_name auf einer anderen Tabelle

m = Gender.create(:gender => 'masculine') 

c = Category.find_by_name("T-shirt", gender: m) 
c.subcategories.create(:name => "Necklace") 

und so weiter.

+0

Was ist die Frage? Übrigens ist find_by_name veraltet. – margo

+0

können Sie versuchen, diese 'c = Category.where (Name:" T-Shirt ", Geschlecht: m.gender) .first' –

+0

die Frage ist, wie man einen Geschlecht und Kategorie Name, um eine Unterkategorie basierend auf den Funden – jjabrams

Antwort

1

Sie können dies versuchen.

m = Gender.create(:gender => 'masculine') 

c = Category.where(name: "T-shirt", gender: m.gender).first 

c.subcategories.create(name: "Necklace") 

Sie bitte den obigen Code beachten Sie wird eine Ausnahme ausgelöst, wenn keine Kategorie mit bestimmten Zustand gefunden, so zu vermeiden, dass Sie folgende verwenden können.

m = Gender.create(:gender => 'masculine') 

c = Category.where(name: "T-shirt", gender: m.gender).try(:first) 

unless c.blank? 
    c.subcategories.create(name: "Necklace") 
end 
+0

das ist es.Vielen Dank @ amit-sharma – jjabrams

2

Während die Antwort von Amit Sharma funktioniert, würde ich vorschlagen, mehrere Verbesserungen dafür zu haben.

Verwenden Sie den neuen Hash-Syntax:

gender = Gender.create!(gender: 'masculine') 

Verwenden find_by statt, wo/erste

category = Category.find_by(gender: gender, name: 'T-Shirt') 

Verwenden Sie den Knall-Varianten, wenn sie nicht den Wert Rückkehr Überprüfung

category.subcategories.create!(name: 'Necklace') 

Verwendung wenn/vorhanden? anstatt aus/leer?

if category.present? 
    category.subcategories.create!(name: 'Necklace') 
end 

(dies ist nur eine Frage des Geschmacks. Aber mein Gehirn scheint Probleme zu haben, es sei denn, Ausdrücke :-) Parsen)

Verwenden find_or_initialize_by/find_or_create_by!

Wenn Sie die Kategorie finden oder erstellen, wenn es nicht vorhanden ist, verwenden Sie find_or_initialize/find_or_create_by(), so können Sie vermeiden, die Null überprüfen:

category = Category.find_or_create_by!(gender: gender, name: 'T-Shirt') 

Also insgesamt würde ich schreiben es mag:

gender = Gender.create!(gender: 'masculine') 
category = Category.find_or_create_by!(gender: gender, name: 'T-Shirt') 
category.subcategories.create!(name: 'Necklace') 
+0

Bang Varianten werden auslösen, die eine 500 verursachen können, wenn die Ausnahme unter behandelt wird. Nicht immer optimal, um die Rendite zu überprüfen, als eine Ausnahme meiner Meinung nach. – engineersmnky

+0

engineersmyky: das ist der Grund, warum ich mich für Bang-Varianten entscheiden, wenn Sie den Rückgabewert nicht überprüfen. Natürlich ist es besser, wenn Sie den Rückgabewert überprüfen und darauf reagieren. –