Rails 4.2.7 mysql设置了两个自定义主键

时间:2016-11-20 01:14:15

标签: mysql ruby-on-rails activerecord

我有两个名为Post和Like的表。我想将“ip”和“reference to post”设置为Like表中的两个主键。我可以使用posts表中的两个唯一键'ip'和'id'成功创建likes表。但是当我尝试从我的rails控制台创建示例数据时,它将首先检查是否存在相同的“ip”。如果相同的'ip'已经存在,即使帖子完全不同,也不会创建数据。

这是我到目前为止所做的。

喜欢表

class CreateLikes < ActiveRecord::Migration   def change
 create_table :likes, :id => false do |t|
   t.string :ip, limit: 39
   t.references :post, index: true, foreign_key: true

   t.timestamps null: false
 end
 add_index :likes, ["ip"], :unique => true   
 add_index :posts, ["id"], :unique => true 
end 
     

帖子表

class CreatePosts < ActiveRecord::Migration   def change
 create_table :posts do |t|
   t.string :title
   t.string :body
   t.string :media

   t.timestamps null: false
 end   
end
end

1 个答案:

答案 0 :(得分:1)

在一个表中有两个主键没有意义。如果您确实有两个始终唯一标识数据的键,则可以使用这两个键的组合键,并且该组合键将充当主键。

以下是如何在Rails中完成此任务:

class CreateLikes < ActiveRecord::Migration
  create_table :likes, id: false do |t|
    t.string :ip, limit: 39
    t.references :post, index: true, foreign_key: true

    t.timestamps null: false
  end
  execute "ALTER TABLE likes ADD PRIMARY KEY (ip,post_id);" 
end

Like模型中:

class Like < ActiveRecord::Base
  self.primary_keys = :ip, :post_id
end