当一个对象保存在rails中时,它的DB中的ID被分配给它。但它实际上并没有保存在数据库中。 在控制台上,我没有看到除了INSERT查询之外的任何查询,这是在after_save之后执行的。
那么rails如何在INSERT查询之前将id分配给对象。
答案 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
。