2

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

class User
  has_many :posts
end

class Post
  belongs_to :user
end

他们的模式看起来像:

User
  id

Post
  id
  user_id

但是现在用户可以通过Facebook/Twitter/等方式登录,我们希望帖子不属于User对象,而是属于provider和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 这样做的方法是什么?

4

2 回答 2

1

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

然而,有一个起点,看这里:

http://compositekeys.rubyforge.org/

于 2012-08-30T05:43:08.093 回答
0

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

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
于 2012-08-30T09:38:02.027 回答