Rails如何在after_save中为对象分配id

时间:2016-03-10 09:20:55

标签: mysql ruby-on-rails

当一个对象保存在rails中时,它的DB中的ID被分配给它。但它实际上并没有保存在数据库中。 在控制台上,我没有看到除了INSERT查询之外的任何查询,这是在after_save之后执行的。

那么rails如何在INSERT查询之前将id分配给对象。

2 个答案:

答案 0 :(得分:0)

不同的dbs有不同的方式。有关详细信息,您必须查看AR模型或您正在使用的任何其他ORM。

对于pg,请参阅 - rails postgres insert

如果您未在记录中获得身份证明,请在schema.rb

中显示更多详情

答案 1 :(得分:0)

通常,这是由数据库本身完成的。通常,表的id列是auto_increment column,这意味着数据库将保留一个自动递增计数器,并在保存时将其值分配给新记录。然后,Rails必须在插入记录后从数据库中拉回新分配的id。

这是Rails在向DB(see docs for the insert method)插入新行时所执行的操作:

# ActiveRecord::ConnectionAdapters::DatabaseStatements#insert
#
# Returns the last auto-generated ID from the affected table.
#
# +id_value+ will be returned unless the value is nil, in
# which case the database will attempt to calculate the last inserted
# id and return that value.
#
# If the next id was calculated in advance (as in Oracle), it should be
# passed in as +id_value+.
def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
  sql, binds = sql_for_insert(to_sql(arel, binds), pk, id_value, sequence_name, binds)
  value      = exec_insert(sql, name, binds, pk, sequence_name)
  id_value || last_inserted_id(value)
end

因此,在实践中,ID永远不会从INSERT语句中的Rails传递。但是在插入之后,创建的Rails对象将定义它id