在Rails 3.1中对不同对象进行建模全局识别

3
我希望为Rails中的对象创建一个全局标识符。该全局标识符是一个数字(或字母数字混合),在许多对象之间共享。当您保存对象时,您将插入基于对象和对象ID的全局标识值。
例如:
location id=3

id=15
arc_type='location'
arc_id=3
arc_value=loc-3

所以问题是,我能否使用对象类型和对象ID的组合外键来进行has_one操作。还是说我需要像对象值、缩写名称和原始对象的ID一样使用一个外键。

或者使用不同的方案,如将md5哈希作为外键。

这是否适合进行多态关联?似乎这更适合于具有has_many关系的情况(例如图片或评论),而不是has_one。有人曾经使用多态关联进行过has_one操作吗?

谢谢

编辑-看起来object_id名称不太合适,所以我用arc_代替了它,这是项目的首字母缩写

1个回答

2
我不确定Rails中的复合外键,因为has_one关联似乎只有:primary_key:foreign_key选项。更多信息请参见这里
不过,我最近已经完成了非常相似的事情。在高层次上,我向所有要唯一标识的模型添加了一个uuid字段,并添加了一段共享代码,在保存时生成UUID。现在每个对象都有一个唯一标识符,我可以使用Rails的:primary_key:foreign_key来随意建立关联。以下是详细信息:
我使用uuidtools gem来生成通用唯一标识符。
Gemfile.rb
gem 'uuidtools'

然后我在app/models中创建了一些帮助方法,以确保在创建或保存ActiveRecord模型时生成并设置UUID。

uuid_helper.rb

module UUIDHelper
  def self.append_features(base)
    base.before_create { |model| base.set_uuid_if_empty(model) }
    base.before_save { |model| base.set_uuid_if_empty(model) }

    def base.set_uuid_if_empty(model)
      if column_names.include?('uuid') and model.uuid.blank?
        model.uuid = UUIDTools::UUID.random_create().to_s
      end
    end
  end
end

最后,我确保我感兴趣的模型有一个uuid字段,类型为字符串,并设置我的关联。

Thing.rb

class Thing < ActiveRecord::Base
  include UUIDHelper

  belongs_to :user, :primary_key => 'uuid', :foreign_key => 'owner'
end


User.rb

class User < ActiveRecord::Base
  include UUIDHelper

  has_many :thing, :primary_key => "uuid", :foreign_key => "owner"
end

我希望这能有所帮助。

非常详细的答案。看起来您确实可以使用多态关联设置has_one:http://guides.rubyonrails.org/association_basics.html#has_one-as - Benoit Garret
那么是否有一个中央表来管理这个?我有一个名为globals_lists的表,其中有这些global_ids的列表,但我不确定如何与之匹配。我的当前实现使用一个名为global_identification的中央表。 - timpone
不需要中央表格。相反,每个模型都有一个uuid列(可以通过migration添加)。 - Ahmish
问题在于这并不能提供解析到第三个表的能力。比如,你想要一个由list_id和global_id管理的项目列表,但是没有办法协调每个表中的uuid。 - timpone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接