我有一个GPA
没有主键的 ActiveRecord 模型:
class GPA < ActiveRecord::Base
end
当我尝试打电话时,GPA.first.to_json
我得到TypeError: false is not a symbol
. 我猜这是因为 ActiveRecord 试图查找主键。实现没有主键的模型的正确方法是什么?
我有一个GPA
没有主键的 ActiveRecord 模型:
class GPA < ActiveRecord::Base
end
当我尝试打电话时,GPA.first.to_json
我得到TypeError: false is not a symbol
. 我猜这是因为 ActiveRecord 试图查找主键。实现没有主键的模型的正确方法是什么?
通常有一些列或列组合一起形成主键。当您说您的表没有主键时,您的意思是它没有id
字段吗?
是否有另一列是唯一/自然键?如果是这样,您可以这样做:
class GPA < ActiveRecord::Base
set_primary_key :strm # eg column strm is a unique/natural key
end
您还可以将复合键与复合键 gem一起使用,如下所示:
class GPA < ActiveRecord::Base
set_primary_keys :student_id, :strm
end
您在迁移或架构中需要这样的东西
create_table :gpas, :id => false do |t|
t.int :strm
t.string :gpa
t.string :acad_career
t.int :student_id
end
在对数据建模时,强烈建议使用 rails 默认约定。如果您正在处理旧表,则仅覆盖默认值。
您必须通过执行以下操作来覆盖模型的主键:
class Foo < ActiveRecord::Base
self.primary_key = "strm"
end
现在,如果您调用.to_json
json 将包含密钥id
而不是strm
.
另一种方法是使用 json 构造函数,例如jbuilder,因此它不会尝试使用默认的 Rails json 构造函数将不存在的“id”转换为 json。
添加一个将 id 添加为列的迁移。它不会损害任何现有代码。只要确保它有一个自动增量,它就不会抱怨重复的条目 0。