我有两个名为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
答案 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