3 votes

modélisation de l'indentification globale pour différents objets dans Rails 3.1

J'ai un système où je veux un identifiant global pour les objets dans les rails. L'identification globale est un numéro (ou alpha-numérique) qui est partagé par un ensemble d'objets. Lorsque vous sauvegardez un objet, vous insérez une valeur d'identification globale qui est basée sur un objet et un object_id.

Donc, par exemple :

location id=3

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

La question est donc de savoir si je peux faire un has_one en utilisant une clé étrangère composite de object_type et object_id. Ou est-ce que j'aurais besoin d'une clé étrangère comme la valeur de l'objet, un nom raccourci et l'identifiant de l'objet original.

Ou peut-être utiliser un scénario différent comme un hachage md5 comme clé étrangère.

Serait-ce un candidat pour faire une association polymorphe ? Il semble que cela serait plus approprié pour les associations has_many plutôt que has_one (comme les images ou les commentaires). Quelqu'un a-t-il déjà fait un has_one avec une association polymorphe ?

thx

edit - il semble que le nom de l'object_id soit une mauvaise idée, j'ai donc substitué arc_ qui est les initiales du projet.

2voto

Ahmish Points 1131

Je ne suis pas sûr de la clé étrangère composite dans Rails, car la clé étrangère composite n'est pas une clé étrangère. has_one L'association ne semble avoir :primary_key y :foreign_key options. Voir plus aquí .

J'ai pourtant accompli quelque chose de très similaire récemment. À un haut niveau, j'ai ajouté un uuid à tous les modèles que je veux identifier de manière unique, ainsi qu'un bout de code partagé qui génère l'UUID lors de la sauvegarde. Maintenant que chaque objet a un identifiant unique, je peux utiliser la fonction :primary_key y :foreign_key de construire des associations comme bon me semble. Voici la répartition :

J'ai utilisé le uuidtools pour générer un identifiant unique et universel.

Gemfile.rb
gem 'uuidtools'

Ensuite, j'ai créé quelques méthodes d'aide dans app/models pour garantir qu'un UUID est généré et défini chaque fois qu'un modèle ActiveRecord est créé ou sauvegardé.

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

Enfin, je m'assure que mes modèles d'intérêt ont une uuid de type chaîne de caractères et de mettre en place mes associations.

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

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X