2011-09-17 3 views
3

レールのオブジェクトのグローバル識別子が必要なシステムがあります。グローバルIDは、複数のオブジェクトにわたって共有される数値(または英数字)です。オブジェクトを保存すると、オブジェクトとobject_idに基づいてグローバル識別値が挿入されます。例えばのでRails 3.1のさまざまなオブジェクトのグローバルな識別のモデリング

location id=3 

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

そこで問題は、私がOBJECT_TYPEとのobject_idの複合外部キーを使用してにhas_oneを行うことができます。または、私はオブジェクトの値、短縮された名前と元のオブジェクトのIDのような外部キーが必要ですか?

おそらく、外部キーとしてmd5ハッシュなどの別のシナリオを使用します。

これは多型関連を行う候補ですか?それはhas_oneよりもhas_many(pictuersやコメントなど)の方が適しているようです。誰もが多形性の凍結を伴うhas_oneをやったことがありますか?

THX

編集 - OBJECT_ID名前は私がhas_one以来、Railsの複合外部キーについてはよく分からない

答えて

2

プロジェクトの頭文字であるので、私はarc_置換まし悪い考えであるように見えます団体は:primary_key:foreign_keyのオプションしか持っていないようです。詳細hereを参照してください。

私は最近これと非常によく似た何かを達成しました。高レベルで、私はuuidフィールドを、保存時にUUIDを生成するコードの共有ビットとともに一意に識別したいすべてのモデルに追加しました。各オブジェクトに固有の識別子が付いたので、Railの:primary_key:foreign_keyを使用して関連付けを行います。内訳は次のとおりです。

私はユニークなIDを生成するためにuuidtools gemを使用しました。

Gemfile.rb 
gem 'uuidtools' 

は、それから私は、UUIDが生成されていることを確認し、ActiveRecordのモデルが作成または保存されるたびに設定するアプリ/モデルにおけるいくつかのヘルパーメソッドを作成しました。

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 

これが役立ちます。

+0

すてきな答えです。実際に多相関連で 'has_one'を設定できるようです:http://guides.rubyonrails.org/association_basics.html#has_one-as –

+0

これを管理する中央テーブルがありますか?私はglobals_listsというテーブルを持っていますが、これらのglobal_idsのリストがありますが、これがどのようにそれに絡み合うかはわかりません。現在の実装では、global_identificationという中央テーブルを使用しています – timpone

+0

中央テーブルは必要ありません。代わりに、各モデルには 'uuid'カラムがあります(これは[migration](http://guides.rubyonrails.org/migrations.html#creating-a-migration)で追加できます)。 – Ahmish

関連する問題