【问题标题】:How to add composite primary keys in db using Rails?如何使用 Rails 在数据库中添加复合主键?
【发布时间】:2017-03-18 07:45:46
【问题描述】:

我正在使用 Rails 5.0 和 Postgresql 9.5

我需要将复合主键添加到我的模型“User_achievement”(您可能会猜到链接“User”和“Achievement”模型)。

所以我尝试使用“composite_primary_keys”gem。我遵循了所有的指示,然而,结果并不像我预期的那样。似乎它没有根据 psql 工具的信息在“user_achievement”表中创建 pkey:

test1_development=> \d user_achievements

Table "public.user_achievements"
Column | Type | Modifiers 

----------------+---------+-----------

user_id | integer | 
achievement_id | integer | 
uach_date | date | 

Indexes:

"index_user_achievements_on_achievement_id" btree (achievement_id)

"index_user_achievements_on_user_id" btree (user_id)

Foreign-key constraints:

"fk_rails_4efde02858" FOREIGN KEY (user_id) REFERENCES users(id)

"fk_rails_c44f5b3b25" FOREIGN KEY (achievement_id) REFERENCES achievements(id)

这是模型和迁移的代码:

class CreateUsers < ActiveRecord::Migration[5.0]
 def change
  create_table :users do |t|
  t.string :name
  end
 end
end

class CreateAchievements < ActiveRecord::Migration[5.0]
 def change
  create_table :achievements do |t|
  t.string :ach_name
  t.text :ach_desc
  end
 end
end

class CreateUserAchievements < ActiveRecord::Migration[5.0]
  def change
   create_table :user_achievements, id: false do |t|
   t.belongs_to :user, :foreign_key => [:id]
   t.belongs_to :achievement, :foreign_key => [:id]
   t.date :uach_date
   end
  end
 end


class Achievement < ApplicationRecord
  has_many :user_achievements
end

class User < ApplicationRecord
  has_many :user_achievements
end

class UserAchievement < ApplicationRecord
  self.primary_keys = :user_id, :achievement_id
  belongs_to :user, :foreign_key => [:id]
  belongs_to :achievement, :foreign_key => [:id]
end

那么 gem 应该改变数据库表吗?或者它只影响轨道的环境? 是否有唯一的方法来改变 db - 在迁移中添加 execute 行?

【问题讨论】:

    标签: ruby-on-rails ruby postgresql rubygems composite-primary-key


    【解决方案1】:

    由于没有人发布任何有用的东西,我现在将分享我所拥有的。

    Gem 'composite_primary_key' (CPK) 不会更改数据库中的任何内容,因此如果您仍然需要它 - 您应该手动进行(将命令添加到迁移中)。

    CPK 唯一要做的就是扩展 Rails 以“理解”复合主键是什么,因为它最初没有并显示错误。

    无论如何,我发现在 Rails 应用程序中使用复合主键是非常复杂和有问题的,因为它使使用其他 gem 变得非常麻烦(每次安装新的 gem 时,请记住某些地方可能会出错)以及更改您的将来使用 cpks 编写代码。此外,对于不熟悉此功能的其他人来说,它也使您的代码更难理解。因此,您应该始终指明您使用过 CPK。

    一个很好的选择是添加一个带有“唯一”选项的索引,这在技术上意味着完全一样,但不需要额外的麻烦。

    所以只有在你真的需要并且没有其他更复杂的解决方案时才使用它!

    【讨论】:

    • composite_primary_keys gem 的文档相当稀少。我建议使用 Sequel,正如 Overbryd 在 stackoverflow.com/a/42185901/3017719 中所建议的那样。
    • @Patrick 这似乎只是 postresql 的一个解决方案,mysql 是否也有任何实际将临时记录添加到数据库的解决方案?
    • @hiradyazdan 根据 GitHub README,Sequel 也有一个 MySQL 适配器。
    猜你喜欢
    • 2019-07-24
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2019-12-12
    相关资源
    最近更新 更多