我如何在Rails 3中传递多个属性到find_or_create_by?

我想使用find_or_create_by,但是这个语句不起作用。 它不会与其他属性“查找”或“创build”。

productproperty = ProductProperty.find_or_create_by_product_id(:product_id => product.id, :property_id => property.id, :value => d[descname]) 

Rails 3中使用dynamic查找器的信息似乎很less,或者根本没有。“和” – 这些一起给我一个未知的方法错误。

更新:

本来我无法得到以下的工作。 请假设我不是一个白痴,“产品”是产品AR模型的一个实例。

 product.product_properties.find_or_create_by_property_id_and_value(:property_id => 1, :value => "X") 

错误的方法是:

 no such keys: property_id, value 

我无法弄清楚。 只有今天早上,我find了像这样传递值的引用:

 product.product_properties.find_or_create_by_property_id_and_value(1, "X") 

瞧,它工作正常。 我会期望一个哈希在相同的情况下工作,但我猜不是。

所以我猜如果你错过了互联网上的东西,你会得到一个投票。

如果要通过多个属性进行search,可以使用“和”来追加它们。 例如:

 productproperty = ProductProperty.find_or_create_by_product_id_and_property_id_and_value(:product_id => product.id, :property_id => property.id, :value => d[descname]) 

有一个小渔获知道。 它将始终返回所指定的对象,即使由于validation错误而无法保存该对象。 所以确保你检查返回的对象是否有一个id(或is_valid?)。 不要假设它在数据库中。

或者,如果对象无法保存,则可以使用方法的“爆炸”版本来引发错误:

http://guides.rubyonrails.org/active_record_querying.html#find-or-create-by-bang

这适用于Rails 3。

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

使用单个查询参数:

 productproperty = ProductProperty.find_or_create_by_product_id(product.id) { |u| u.property_id => property_id, u.value => d[descname] } ) 

或者用多个参数进行扩展:

 productproperty = ProductProperty.find_or_create_by_product_id(:product_id => product.id, :property_id => property_id, :value => d[descname]) { |u| u.property_id => property_id, u.value => d[descname] } ) 

将与以下工作:

 conditions = { :product_id => product.id, :property_id => property.id, :value => d[descname] } pp = ProductProperty.find(:first, :conditions => conditions) || ProductProperty.create(conditions) 

你也可以使用where(...).first_or_create – ActiveRecord :: Relation#first_or_create 。

 product_property_attrs = { product_id: product.id, property_id: property.id, value: d[descname] } product_property = ProductProperty.where(product_property_attrs).first_or_create 

我发现在Rails 3.1中,你不需要将属性作为散列来传递。 你只是自己传递值。

 ProductProperty.find_or_create_by_product_id_and_property_id_and_value( product.id, property.id, d[descname]) 

在Rails 4中,可以使用find_or_create_by(attr1: 1, attr2: 2)来查找或创build多个属性。

你也可以做这样的事情:

 User.create_with( password: 'secret', password_confirmation: 'secret', confirmation_date: DateTime.now ).find_or_create_by( email: 'admin@domain.com', admin: true ) 

如果您需要使用某些属性创build用户,但无法通过这些属性进行search。