Mysql Rails ActiveRecord—有没有一种方法可以在没有id的表上执行操作?

Mysql Rails ActiveRecord—有没有一种方法可以在没有id的表上执行操作?,mysql,ruby-on-rails,ruby,activerecord,Mysql,Ruby On Rails,Ruby,Activerecord,我有一个一行两列的表格- int 'version', datetime 'updated' 有没有Rails ActiveRecord方法来获取和设置这些列中的数据? 没有id列 我使用此表跟踪其他表的查询版本。每次查询另一个表后,version列将递增,更新的列将设置为current datetime。当不存在id列时,Rails唯一可以使用的是has\u和\u属于\u many联接表 否则,您必须使用纯SQL,例如: SomeModel.connection.execute "selec

我有一个一行两列的表格-

int 'version', datetime 'updated'
有没有Rails ActiveRecord方法来获取和设置这些列中的数据? 没有id列


我使用此表跟踪其他表的查询版本。每次查询另一个表后,version列将递增,更新的列将设置为current datetime。

当不存在
id
列时,Rails唯一可以使用的是
has\u和\u属于\u many
联接表

否则,您必须使用纯SQL,例如:

SomeModel.connection.execute "select * from mytable"


或者,如果
version
打算用作主键,请使用John的答案。

在模型类中,使用
self.primary\u key=“primary\u key\u column”
指定要用作主键列的列。我想在您的情况下,您可以使用版本列。

没有任何东西阻止您在没有ID的ActiveRecord中使用它:

迁移包括:

create_table :posts, :id => false do |t|
  t.integer :version
  t.datetime :updated
end
查询:

>> Post.create(:version => 1, :updated => Time.now)
=> #<Post version: 1, updated: "2009-05-05 19:24:31">
>> Post.all
=> [#<Post version: 1, updated: "2009-05-05 19:24:31">]
>> Post.all(:conditions => { :version => 1 })
=> [#<Post version: 1, updated: "2009-05-05 19:24:31">]

希望这能有所帮助

我的目的是让这个表的工作方式类似于Rails使用“schema_info”表跟踪迁移版本的方式。我已经就这个主题发表了一篇博客:我不知道它是这样工作的。很酷的东西。尽管如此,我认为更新或删除不会像预期的那样工作,因为这些操作依赖于现有的主键..all是.find(:all)的别名。使用大多数其他参数来.find将由于缺少id而导致错误。
CREATE TABLE "posts" ("version" integer, "updated" datetime) ;
INSERT INTO "posts" ("version", "updated") VALUES(1, '2009-05-05 19:24:31');
SELECT * FROM "posts" 
SELECT * FROM "posts" WHERE ("posts"."version" = 1)