2016-04-19 9 views
-3

私は性別を持ち、性別に基づいてカテゴリとサブカテゴリを作成します。他のテーブルのfind_by_name

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

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

など。

+0

どうしますか?ちなみに、find_by_nameは非推奨です。 – margo

+0

これは 'c = Category.where(名前:" Tシャツ "、性別:m.gender).first'を試すことができます。 –

+0

質問は性別とカテゴリ名を取得して検索結果に基づいてサブカテゴリを作成する方法です – jjabrams

答えて

1

これを試すことができます。

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

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

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

何のカテゴリが与えられた条件で見つからない場合ので、あなたは、次を使用することができることを避けるために、例外が発生しますコードの上に注意してください。

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

それだけです。非常に@ amit-sharmaありがとうございます – jjabrams

2

Amit Sharmaの答えが働いている間に、私はいくつかの改善があると思います。

を使用して、新しいハッシュ構文:

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

利用find_by代わりの場所/

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

使用戻り値

をチェックしていないとき強打変異体を最初に
category.subcategories.create!(name: 'Necklace') 

if/presentを使用しますか?代わりに/空白?

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

(これは単なる好みの問題です。しかし、私の脳は:-) ない限り、表現の構文解析の悩みがあるようです)

使用find_or_initialize_by/find_or_create_byを!

カテゴリを見つけるか、またはそれが存在しない場合は、それを作成し、find_or_initialize/find_or_create_byを使用する場合は()あなたがnilのチェックを回避することができます!

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

をので、合計で私が書くだろうそれは好きです:

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

例外が処理されている場合、500を引き起こす可能性のあるバグのバリアントが発生します。私の意見では、例外を処理するよりも返品をチェックする方が必ずしも最適ではありません。 – engineersmnky

+0

engineersmnky:その理由は、返値をチェックしていないときに私がバングのバリアントを選んだ理由です。もちろん、戻り値を確認してそれに反応する方が良いでしょう。 –

関連する問題