AKW*_*KWF 42 ruby-on-rails ruby-on-rails-3
我想使用find_or_create_by,但是这个语句不起作用.它不与其他属性"查找"或"创建".
productproperty = ProductProperty.find_or_create_by_product_id(:product_id => product.id, :property_id => property.id, :value => d[descname])
Run Code Online (Sandbox Code Playgroud)
似乎很少或没有关于在Rails 3中使用动态查找器的信息."和" - 这些一起给了我一个未知的方法错误.
更新:
最初我无法让以下工作.请假设我不是白痴,"产品"是产品AR模型的一个实例.
product.product_properties.find_or_create_by_property_id_and_value(:property_id => 1, :value => "X")
Run Code Online (Sandbox Code Playgroud)
错误方法是:
no such keys: property_id, value
Run Code Online (Sandbox Code Playgroud)
我无法理解这一点.只有今天早上我找到了传递这样的值的引用:
product.product_properties.find_or_create_by_property_id_and_value(1, "X")
Run Code Online (Sandbox Code Playgroud)
瞧,它运作正常.我原本希望哈希在相同的情况下工作,但我猜不是.
如果你错过互联网上的某些内容,我想你会得到一次投票?
小智 52
如果要按多个属性进行搜索,可以使用"和"来追加它们.例如:
productproperty = ProductProperty.find_or_create_by_product_id_and_property_id_and_value(:product_id => product.id, :property_id => property.id, :value => d[descname])
Run Code Online (Sandbox Code Playgroud)
有一个小问题需要注意.它将始终返回您指定的对象,即使由于验证错误而无法保存该对象.因此,请确保检查返回的对象是否具有id(或is_valid?).不要假设它在数据库中.
或者,如果无法保存对象,则可以使用方法的"bang"版本引发错误:
http://guides.rubyonrails.org/active_record_querying.html#find-or-create-by-bang
这适用于Rails 3.
Bvu*_*Ic7 23
请参阅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] } )
Run Code Online (Sandbox Code Playgroud)
或使用多个参数扩展:
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] } )
Run Code Online (Sandbox Code Playgroud)
适用于:
conditions = { :product_id => product.id,
:property_id => property.id,
:value => d[descname] }
pp = ProductProperty.find(:first, :conditions => conditions) || ProductProperty.create(conditions)
Run Code Online (Sandbox Code Playgroud)
Pab*_*ero 10
你也可以使用where(...).first_or_create
- 的ActiveRecord ::#关系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
Run Code Online (Sandbox Code Playgroud)
我在Rails 3.1中发现你不需要将属性作为哈希传递.您只需传递值.
ProductProperty.find_or_create_by_product_id_and_property_id_and_value(
product.id, property.id, d[descname])
Run Code Online (Sandbox Code Playgroud)
在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: 'admin@domain.com',
admin: true
)
Run Code Online (Sandbox Code Playgroud)
如果需要创建具有某些属性的用户,但无法按这些属性进行搜索.
归档时间: |
|
查看次数: |
36978 次 |
最近记录: |