12

我有一个GPA没有主键的 ActiveRecord 模型:

class GPA < ActiveRecord::Base

end

当我尝试打电话时,GPA.first.to_json我得到TypeError: false is not a symbol. 我猜这是因为 ActiveRecord 试图查找主键。实现没有主键的模型的正确方法是什么?

在此处输入图像描述

4

5 回答 5

18

通常有一些列或列组合一起形成主键。当您说您的表没有主键时,您的意思是它没有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
于 2013-09-25T05:42:26.837 回答
2

您在迁移或架构中需要这样的东西

create_table :gpas, :id => false do |t|
  t.int :strm
  t.string :gpa
  t.string :acad_career
  t.int :student_id
end
于 2013-09-20T19:58:28.670 回答
2

在对数据建模时,强烈建议使用 rails 默认约定。如果您正在处理旧表,则仅覆盖默认值。

选项1

您必须通过执行以下操作来覆盖模型的主键:

class Foo < ActiveRecord::Base
    self.primary_key = "strm"
end

现在,如果您调用.to_jsonjson 将包含密钥id而不是strm.

选项 2

另一种方法是使用 json 构造函数,例如jbuilder,因此它不会尝试使用默认的 Rails json 构造函数将不存在的“id”转换为 json。

于 2013-09-29T21:35:09.947 回答
1

添加一个将 id 添加为列的迁移。它不会损害任何现有代码。只要确保它有一个自动增量,它就不会抱怨重复的条目 0。

于 2013-09-30T05:41:31.110 回答
-1

你试过ActiveModel::Serializers::JSON吗?

于 2013-09-27T18:11:40.763 回答