【问题标题】:In Rails, how to reference a model to another model through multiple columns?在 Rails 中,如何通过多个列将一个模型引用到另一个模型?
【发布时间】:2023-03-19 21:25:01
【问题描述】:

假设我们正在创建一个博客。通常,模型如下所示:

class User
  has_many :posts
end

class Post
  belongs_to :user
end

他们的架构看起来像:

User
  id

Post
  id
  user_id

但是现在,用户可以通过 Facebook/Twitter/etc 登录,我们希望帖子不属于 User 对象,而是属于 provider 的组合提供者的 uid

新架构如下所示:

User
  id
  provider
  uid

Post
  id
  user_provider
  user_uid

而且我不确定模型会是什么样子:

class User
  has_many :posts, :foreign_key => ['user_provider', 'user_uid'] # Is this right??
end

class Post
  belongs_to :user, :class_name => User # Again, this is a guess...
end

我在正确的轨道上吗? Rails 的做法是什么?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    您不能在开箱即用的轨道中拥有复合主键。我认为你将不得不使用宝石。我建议您找到解决方法。

    不过要有个起点,请看这里:

    http://compositekeys.rubyforge.org/

    【讨论】:

      【解决方案2】:

      你能详细说明你为什么要这样做吗?

      Rails 的标准做法是,主键是一个称为“id”的整数,因此外键遵循这一点。

      但是,没有什么能阻止您创建复合索引并确保复合唯一性。

      在 Post 模型上,你可以写:

      validate_uniqueness_of :uid, :scope => :provider
      

      或使用较新的 Rails 3 语法:

      validates :uid, :uniqueness => {:scope => :provider}
      

      您可以在迁移中添加复合索引:

      add_index :posts, [:uid, :provider]
      

      或使用唯一索引在数据库级别强制唯一性:

      add_index :posts, [:uid, :provider], :unique => true
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-24
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2018-02-27
        • 1970-01-01
        • 1970-01-01
        • 2021-08-06
        相关资源
        最近更新 更多