Rails имеет связь с не классом? - PullRequest
0 голосов
/ 10 августа 2011

Я хотел бы построить модель, в которой класс ServiceRegions имеет отношение многие ко многим с почтовыми индексами. То есть ServiceRegions могут охватывать несколько почтовых индексов, и они могут перекрываться, поэтому один и тот же почтовый индекс может быть связан с несколькими ServiceRegions.

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

Вот соответствующий код:

class ServiceRegion < ActiveRecord::Base
  has_many :z_sr_relationships, :dependent => :destroy,
           :foreign_key => :service_region_id

  has_many :zips, :through => :z_sr_relationships, :source => :zip

  def includes_zip!(zip)
    z_sr_relationships.create!( :zip_id => zip, :service_region_id => self.id)
  end
end

class ZSrRelationship < ActiveRecord::Base
  attr_accessible :service_region_id, :zip

  belongs_to :service_region, :class_name => "ServiceRegion"

  validates :zip, :presence => true
  validates :service_region_id, :presence => true
end

Когда я делаю шоу на экземпляре ServiceRegion и пытаюсь вывести my_service_region.zips, он выдает ошибку, что не может найти почтовые индексы ассоциации.

Предназначено ли Rails для того, чтобы позволить вам сделать много-многую ассоциацию с базовым типом, таким как строка, или с int, который не является определенным классом с собственным файлом модели?

1 Ответ

2 голосов
/ 10 августа 2011

Любая ассоциация: has_many, own_to, has_many: хотя и т. Д. Должна относиться к подклассам активной записи. У объектов, которые не являются потомками AR, не будет базы данных для связи с объектами AR.

Я думаю, что вы получаете сообщение об ошибке "не удается найти связь", потому что вы указываете: source =>: zip. Вам нужно иметь класс под названием Zip. У вас есть класс с именем ZSrRelationship, которого ожидает rails, поэтому вам, вероятно, следует просто оставить опцию source вне.

...