没有主键的ActiveRecord模型
我有一个没有主键的ActiveRecord模型GPA
:
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默认约定。 如果要处理旧表,则仅覆盖默认值。
选项1
您必须通过执行以下操作覆盖模型的主键:
class Foo < ActiveRecord::Base self.primary_key = "strm" end
现在,如果你调用.to_json
,json将包含密钥id
而不是strm
。
选项2
替代方法是使用json构造函数,例如jbuilder ,因此它不会尝试使用默认的Rails json构造函数将不存在的'id'转换为json。
你试过ActiveModel :: Serializers :: JSON吗?
添加将id添加为列的迁移。 它不会伤害任何现有的代码。 只要确保它有一个自动增量,所以它不会抱怨重复输入0。