class User < ActiveRecord::Base
has_one :location, :dependent => :destroy, :as => :locatable
has_one :ideal_location, :dependent => :destroy, :as => :locatable
has_one :birthplace, :dependent => :destroy, :as => :locatable
end
class Location < ActiveRecord::Base
belongs_to :locatable, :polymorphic => true
end
class IdealLocation < ActiveRecord::Base
end
class Birthplace < ActiveRecord::Base
end
Я действительно не вижу никакой причины иметь подклассы в этой ситуации. Поведение объектов местоположения идентично, единственная цель - облегчить ассоциации. Я также предпочел бы хранить данные как int, а не как строку, так как это позволит индексам базы данных быть меньше.
Я представляю что-то вроде следующего, но не могу закончить мысль:
class User < ActiveRecord::Base
LOCATION_TYPES = { :location => 1, :ideal_location => 2, :birthplace => 3 }
has_one :location, :conditions => ["type = ?", LOCATION_TYPES[:location]], :dependent => :destroy, :as => :locatable
has_one :ideal_location, :conditions => ["type = ?", LOCATION_TYPES[:ideal_location]], :dependent => :destroy, :as => :locatable
has_one :birthplace, :conditions => ["type = ?", LOCATION_TYPES[:birthplace]], :dependent => :destroy, :as => :locatable
end
class Location < ActiveRecord::Base
belongs_to :locatable, :polymorphic => true
end
С этим кодом происходит следующее, что делает его бесполезным:
user = User.first
location = user.build_location
location.city = "Cincinnati"
location.state = "Ohio"
location.save!
location.type # => nil
Это очевидно, потому что нет способа перевести опции: condition в объявлении has_one в тип, равный 1.
Я мог бы встроить идентификатор в представление везде, где появляются эти поля, но это тоже кажется неправильным:
<%= f.hidden_field :type, LOCATION_TYPES[:location] %>
Есть ли способ избежать лишних подклассов или заставить работать подход LOCATION_TYPES?
В нашем конкретном случае приложение хорошо осведомлено о местоположении, и объекты могут иметь много разных типов местоположений. Я просто странный, не хочу всех этих подклассов?
Любые ваши предложения приветствуются, скажите мне, что я сумасшедший, если хотите, но хотите ли вы увидеть более 10 различных моделей местоположения, плавающих вокруг приложения / моделей?