我想使用find_或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")

瞧,效果很好.我本以为哈希在同样的情况下也会起作用,但我猜不会.

所以我猜如果你错过了互联网上的一些东西,你会得到一张反对票吗?

推荐答案

如果要按多个属性进行搜索,可以使用"和"来附加属性.例如:

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

有一个小问题需要注意.它将始终返回您指定的对象,即使该对象由于验证错误而无法保存.因此,请确保判断返回的对象是否有id(或者是否有效?).不要假设它在数据库中.

或者,如果无法保存对象,可以使用"bang"版本的方法引发错误:

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

这适用于Rails 3.

Ruby-on-rails相关问答推荐

在ransackable_scopes中的作用域上创建activeadmin过滤器

如何使用 Rails 语义记录器记录整个请求(标头、正文等)

显示每个 rspec 示例的运行时

Rails 路由到唯一索引

blueprint/screen.css 未预编译

Rails:如何小写非英文字符串?

如何更改 Heroku 应用程序的 DATABASE_URL

为什么使用 HTTP PUT 和 DELETE 方法而不是 POST?

如何避免 RSpec 3.0 中 stub_chain 的弃用警告?

禁用 RVM 或使用没有 RVM 安装的 Ruby?

简单表单关联自定义标签名称

bundle和gem安装的区别?

Rails - 如何在 f.submit 上放置确认弹出窗口?

Rails:使用 gem 卸载特定版本的库

如何让 ActiveAdmin 使用强参数?

我们如何在 Rails Mailer 中设置邮箱发件人的名称?

Ruby 根据属性在数组中查找并返回对象

Rspec:如何在控制器规范中分配实例变量

向 Rails 模型添加外键

从模型中获取验证