2011-08-10 7 views
0

私は、ServiceRegionsのクラスが郵便番号との多対多の関係を持つモデルを構築したいと思います。つまり、ServiceRegionsは複数の郵便番号をカバーする可能性があり、重複する可能性があるため、同じ郵便番号を複数のServiceRegionsに関連付けることができます。Railsは非クラスのhas_manyアサーションを使用しますか?

私はZipCodeクラスを作成するのではなく、リレーションシップテーブルに直接郵便番号を格納したいと考えていましたが、コードを正しく動作させることができません。私は正常に関係を作成するコードを持っていましたが、できると思うように関連するzipの配列にアクセスすることはできませんでした。私はServiceRegionのインスタンスでショーを行うと、出力my_service_region.zipsにしようとすると

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 

が、それは私にそれが関連のジッパーを見つけることができないというエラーを与える:

はここに関連するコードです。

Railsは、独自のモデルファイルを持つ定義されたクラスではない文字列やintのような基本型と多対多の関連付けを行うことを目的としていますか?

答えて

2

任意の関連付け:has_many、belongs_to、has_many:など。アクティブなレコードのサブクラスに関連する必要があります。 ARの子孫ではないオブジェクトには、ARオブジェクトに関連するデータベースバッキングはありません。

source =>:zipを指定しているため、「関連付けが見つかりません」というエラーが表示されると思います。 Zipというクラスが必要です。あなたはZSrRelationshipというクラスを持っています。これはレールが期待するものなので、ソースオプションをそのまま残すべきです。

+0

ありがとうございます@ルークコウェル。それはhas_manyが行く方法ではないという私の質問に答える。 zip-> service_regionの関連付けをテーブルにこれらの2つの列と一緒に格納してから、service_regionにメソッドを作成して、配列形式のzipを取得できるようにしてください。 – LikeMaBell

+0

あなたの要件に基づいて、私はあなたが必要と思っています:service_region has_and_belongs_to_many:zips association。私は、より複雑なデータ型をデータベースに格納することを避けています。それは早すぎる最適化のような感じです。 –

関連する問題