没有主键的ActiveRecord模型

时间:2013-09-20 18:28:05

标签: ruby-on-rails ruby ruby-on-rails-4

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

class GPA < ActiveRecord::Base

end

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

enter image description here

5 个答案:

答案 0 :(得分:17)

通常,有一些列或列的组合一起形成主键。当你说你的表没有主键时,你的意思是它没有id字段吗?

是否有另一列是唯一/自然键?如果是这样,你可以这样做:

class GPA < ActiveRecord::Base
  set_primary_key :strm    # eg column strm is a unique/natural key
end

您还可以将复合键与composite keys gem一起使用,如下所示:

class GPA < ActiveRecord::Base
  set_primary_keys :student_id, :strm
end

答案 1 :(得分:2)

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

create_table :gpas, :id => false do |t|
  t.int :strm
  t.string :gpa
  t.string :acad_career
  t.int :student_id
end

答案 2 :(得分:2)

建议在建模数据时使用rails默认约定是非常明智的。如果您正在处理遗留表,则仅覆盖默认值。

选项1

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

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

现在,如果您致电.to_json,则json将包含密钥id而不是strm

选项2

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您是否尝试过ActiveModel::Serializers::JSON