来自Guides http://guides.rubyonrails.org/v3.2.13/active_record_querying.html#first_or_create
首先或创建
The first_or_create
方法检查是否first
返回零或不返回。如果它确实返回 nil,那么create
叫做。当与where
方法。让我们看一个例子。
假设你想找到一个名为“Andy”的客户端,如果没有,则创建一个,并将其锁定属性设置为 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">
该方法生成的 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
first_or_create
返回已存在的记录或新记录。在我们的例子中,我们还没有名为 Andy 的客户,因此创建并返回记录。
首先或创建!
您还可以使用first_or_create!
如果新记录无效则引发异常。本指南未涵盖验证,但我们暂时假设您临时添加
validates :orders_count, :presence => true
到您的客户端模型。如果您尝试在不传递orders_count的情况下创建新客户端,则记录将无效并引发异常:
Client.where(:first_name => 'Andy').first_or_create!(:locked => false)
# => ActiveRecord::RecordInvalid: Validation failed: Orders count can't be blank