ruby-on-rails - rails入门 - ruby on rails中国



如何在Rails 3中将多个属性传递给find_or_create_by? (4)

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

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

似乎很少或没有关于在Rails 3中使用动态查找器的信息。“和” - 这些一起给我一个未知的方法错误。

更新:

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

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

错误方法是:

no such keys: property_id, value

我无法理解这一点。 只有今天早上我找到了传递这样的值的引用:

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

瞧,它运作正常。 我本来希望哈希在相同的情况下工作,但我猜不是。

如果你错过互联网上的某些内容,我想你会得到一次投票?

https://ffff65535.com


你也可以使用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 4中,您可以使用find_or_create_by(attr1: 1, attr2: 2)来查找或创建多个属性。

您还可以执行以下操作:

User.create_with(
  password: 'secret', 
  password_confirmation: 'secret',
  confirmation_date: DateTime.now
).find_or_create_by(
  email: '[email protected]',
  admin: true
)

如果需要创建具有某些属性的用户,但无法按这些属性进行搜索。


我在Rails 3.1中发现你不需要将属性作为哈希传递。 您只需传递值。

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

请参阅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) 




ruby-on-rails-3