Rails find_by_name 在另一个 table

Rails find_by_name on another table

我有性别并根据性别名称创建类别和子类别。

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

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

等等。

你可以试试这个。

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

虽然 Amit Sharma 的答案有效,但我建议对其进行一些改进。

使用新的哈希语法:

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

使用find_by代替where/first

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

不检查 return 值时使用 bang 变体

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

使用if/present?而不是 unless/blank?

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')