Pergunta

Sou novo no Rails e ainda não entendi todas as possibilidades com associações. Aqui está o meu problema:

Eu tenho alguns modelos como Apple e Lemon. Depois, há a 'relação' do modelo que mantém triplos de relações:

Assunto | relação | objeto

Apple | é mais doce que | limão

A migração para 'relações' é esta:

create_table :relations do |t|
  t.references :subject,  :polymorphic => true
  t.string     :relation
  t.references :object,   :polymorphic => true
  t.timestamps    
end

Isso deve armazenar relações como

sujeito_id = 1

sujeito_type = Apple

relação = é mais doce que

object_id = 2

object_type = limão

Na realidade, tenho mais do que apenas 2 modelos, então pensei em tornar o assunto e o modelo-agnóstico da coluna de objeto usando a opção polimórfica.

Como você definiria as associações nas classes modelo de maçã, limão e relação? O design da tabela de relações é bom assim?

Muito obrigado pela sua ajuda!!

-Alex

Foi útil?

Solução

Dê ao esquema do banco de dados que você descreveu, parece que deve ser bastante direto:

class Relation < ActiveRecord::Base
  belongs_to :object, :polymorphic => true
  belongs_to :subject, :polymorphic => true
end

E suas outras aulas seriam assim

class Apple < ActiveRecord::Base
  has_many :object_relations, :class_name => 'Relation', :as => :object
  has_many :subject_relations, :class_name => 'Relation', :as => :subject
end

class Orange < ActiveRecord::Base
  has_many :object_relations, :class_name => 'Relation', :as => :object
  has_many :subject_relations, :class_name => 'Relation', :as => :subject
end

Outras dicas

Polimórfico é dor:

A menos que você precise mal, use algo como o SingLetableInertance:

class Fruit < ActiveRecord::Base
   has_many :relations
   has_many :related_objects, :through => :relation, :class_name => 'Fruit'
   has_many :relating_subjects, :through => :relation, :class_name => 'Relation'
end
class Relation < ActiveRecord::Base
   belongs_to :object, :class => 'Fruit'
   belongs_to :subject, , :class => 'Fruit'
   validate_presence_of :object_id
   validate_presence_of :subject_id
   validate_presence_of :relation
end

E então gosto:

class Apple < Fruit
   ...
end

Espero que ajude (eu não testei este código)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top