Наследование классов или наследование одной таблицы в Rails 2.3

У меня есть следующий сценарий, и я не уверен, следует ли мне использовать наследование классов или наследование одной таблицы:

Class User
  has_one :main_list
  has_one :known_list
  has_many :regular_lists
end

Class List
  has_many :words
end

Class Word
  belongs_to :list
end

Я хотел бы, чтобы каждый тип списка был другим классом, проблема в том, что если я это сделаю, мне нужно будет добавить main_list_id, known_list_id и regular_list_id к объекту/классу Word. Это кажется громоздким. Могу ли я сделать что-то вроде:

Class MainList
  has_many :words, :foreign_key => list_id
end

а потом что-то вроде:

@user.main_list.find_by_name("MainList") ?

Единственная проблема заключается в том, что кто-то может назвать RegularList "MainList".


person TenJack    schedule 13.11.2010    source источник


Ответы (1)


Вы можете сделать что-то вроде этого:

Class User < ActiveRecord::Base
   has_many :lists
end

Class List < ActiveRecord::Base
  belongs_to :user
  has_and_belongs_to_many :words
end

Class Word < ActiveRecord::Base
  has_and_belongs_to_many :lists
end

В классе списка вы можете добавить в список два логических поля; один для main_list и другой для known_list. В этом классе вы также можете добавить проверки, чтобы убедиться, что у каждого пользователя есть только один основной список и один известный список. Чтобы выбрать основной список для пользователя, вы можете сделать:

@user.lists.find(:first, :conditions => {:main_list => true})
person Sean Hill    schedule 13.11.2010
comment
Интересная идея, а как насчет @user.regular_lists сейчас? Разве это не вернет все списки, включая main_list и known_list? Подойдет ли индекс для этих логических полей? - person TenJack; 14.11.2010
comment
Чтобы найти их, это будет @user.lists.find(:first, :conditions =› {:main_list =› false, :known_list =› false}). Вы также можете упростить это, создав именованные области. И нет, было бы неплохо индексировать логические поля... просто индексировать user_id. - person Sean Hill; 14.11.2010
comment
Изменить выше: запрос должен быть @user.lists.find(:all, :conditions =› {:main_list =› false, :known_list =› false}), поскольку существует несколько обычных списков... Извините за это. - person Sean Hill; 14.11.2010