ruby-on-rails: создание моделей с наследованием одной таблицы? - PullRequest
0 голосов
/ 23 октября 2009

У меня есть несколько моделей в моей системе:

  • Репутация пользователя
  • Репутация сообщения
  • Репутация ответа

(аналогично SO).

Итак, у них общий код:

  • Увеличение и уменьшение значений
  • уникальный_идентификатор, принадлежащий трем объектам, которые представляет репутация (Пользователь, Публикация, Ответ)

Если бы существовал C ++, у меня был бы суперкласс с именем "Reputation", который бы инкапсулировал эти понятия.

В настоящее время у меня есть три модели, которые определены отдельно, но когда я строю систему, я начинаю понимать, что существует много дублирования кода и т. Д.

Если бы я использовал STI, мне пришлось бы заполнить поле owner_id, которое было бы object_id и owner_type.

Итак, как лучше всего справиться с этим делом?

1 Ответ

2 голосов
/ 23 октября 2009

Будет ли какой-либо уникальный код в любой из моделей репутации?

Если нет, вы можете обойтись с belongs_to :owner, :polymorphic => true в общей модели репутации.

В противном случае вы сможете обойтись, указав аргумент: class_name в вызовах own_to в каждой подмодели.

Код для модели с одной репутацией: (Для репутации требуется owner_id: integer и owner_type: строковые столбцы)

class Reputation < ActiveRecord::Base
  belongs_to :owner, :polymorphic => true
  ...
end

class User < ActiveRecord::Base
  has_one :reputation, :as => :owner
end

class Post < ActiveRecord::Base
  has_one :reputation, :as => :owner
end

class Response < ActiveRecord::Base
  has_one :reputation, :as => :owner
end

Репутация подклассов (Таблице репутации требуется owner_id: integer и тип: строковые столбцы)

class Reputation < ActiveRecord::Base
  ...
end

class UserReputation < Reputation
  belongs_to :owner, :class_name => "User"
  ...
end

class PostReputation < Reputation
  belongs_to :owner, :class_name => "Post"
  ...
end

class ResponseReputation < Reputation
  belongs_to :owner, :class_name => "Response"
  ...
end


class User < ActiveRecord::Base
  has_one :user_reputation, :foreign_key => :owner_id
  ...
end

class Post < ActiveRecord::Base
  has_one :post_reputation, :foreign_key => :owner_id
  ...
end

class Response < ActiveRecord::Base
  has_one :response_reputation, :foreign_key => :owner_id
  ...
end
...