Как настроить has_many_polymorphs параметры CRUD

Ответов: 2


0 принят

Полиморфные отношения должны делать большую часть того, что вам нужно, хотя, если ваши кошки и собаки дружат со свиньями, и вы хотите знать, кто инициировал дружбу, мое предыдущее решение слишком упрощено.

class Animal < ActiveRecord::Base
  belongs_to :creatures, :polymorphic => true
  named_scope :cats, :conditions => {:creature_type => 'Cat'}
  named_scope :dogs, :conditions => {:creature_type => 'Dog'}
  named_scope :pigs, :conditions => {:creature_type => 'Pig'}
end

class Cat < ActiveRecord::Base
  has_many :friends, :as => :creatures
end

class Dog < ActiveRecord::Base
  has_many :friends, :as => :creatures
end

class Pig < ActiveRecord::Base
  has_many :friends, :as => :creatures
end

Это может быть не то, что вы хотите, но это позволит вам называть cat.friends и cat.friends.dogs, cat.friends.pigs и т. Д.

Вы можете добавлять has_manyассоциации, чтобы вы могли напрямую вызвать cat.dogs и cat.pigs.

class Cat < ActiveRecord::Base
  has_many :friends, :as => :creatures
  has_many :dogs, :through => :animal
  has_many :pigs, :through => :animal
end

Я не уверен, что это то, что вы ищете, но я думаю, что это более простой способ пойти, и простой всегда лучше.


0

Я бы выбрал модель Cat и Dog, а затем использовал ассоциацию has_and_belongs_to_many?

class Cat < ActiveRecord::Base
  has_and_belongs_to_many :dogs
end

class Dog < ActiveRecord::Base
  has_and_belongs_to_many :cats
end

Тогда таблица соединений будет выглядеть так:

create_table "cats_dogs", :id => false, :force => true do |t|
  t.integer  "cat_id"
  t.integer  "dog_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

Вы могли бы вызвать cat.dogs и dog.cats, чтобы найти «дружеские отношения».

рубин-на-рельсы, ActiveRecord, плагины, полиморфизм,
Похожие вопросы