Rails first_or_create ActiveRecord方法

Mar*_*ins 24 ruby activerecord ruby-on-rails rails-activerecord

什么是first_or_create/ first_or_create!法Rails的呢?

根据文档,方法" 没有描述 "......

Pav*_*van 53

来自指南

first_or_create

该first_or_create方法检查是否首先返回nil.如果确实返回nil,则调用create.当与where方法结合使用时,这非常强大.我们来看一个例子吧.

假设您要查找名为"Andy"的客户端,如果没有,请创建一个并另外将其locked属性设置为false.您可以通过运行:

Client.where(:first_name => 'Andy').first_or_create(:locked => false)
# => #<Client id: 1, first_name: "Andy", orders_count: 0, locked: false, created_at: "2011-08-30 06:09:27", updated_at: "2011-08-30 06:09:27">
Run Code Online (Sandbox Code Playgroud)

此方法生成的SQL如下所示:

SELECT * FROM clients WHERE (clients.first_name = 'Andy') LIMIT 1
BEGIN
INSERT INTO clients (created_at, first_name, locked, orders_count, updated_at) VALUES ('2011-08-30 05:22:57', 'Andy', 0, NULL, '2011-08-30 05:22:57')
COMMIT
Run Code Online (Sandbox Code Playgroud)

first_or_create返回已存在的记录或新记录.在我们的例子中,我们还没有一个名为Andy的客户端,因此创建并返回了记录.

first_or_create!

first_or_create!如果新记录无效,您还可以使用引发异常.本指南不包含验证,但我们暂时假设您暂时添加

validates :orders_count, :presence => true
Run Code Online (Sandbox Code Playgroud)

到您的客户端模型.如果您尝试在不传递orders_count的情况下创建新客户端,则该记录将无效并将引发异常:

Client.where(:first_name => 'Andy').first_or_create!(:locked => false)
# => ActiveRecord::RecordInvalid: Validation failed: Orders count can't be blank
Run Code Online (Sandbox Code Playgroud)