在Rails中,如何通过多列将模型引用到另一个模型?

时间:2012-08-30 05:32:28

标签: ruby-on-rails activerecord

假设我们正在制作一个博客。通常,模型看起来像这样:

class User
  has_many :posts
end

class Post
  belongs_to :user
end

他们的模式如下:

User
  id

Post
  id
  user_id

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

2 个答案:

答案 0 :(得分:1)

您无法在开箱即用的导轨中使用复合主键。 Fot我认为你必须使用宝石。我建议你找一个解决方法。

但是要有一个起点,请看这里:

http://compositekeys.rubyforge.org/

答案 1 :(得分: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