0

以下はRails3.0.xで機能しましたが、3.2では機能しません

class Phone < ActiveRecord::Base
  attr_accessible :phone_number

  has_one :zipcode, :primary_key => :area_code_id, :foreign_key => :area_code

  def area_code_id
    phone_number[0..2]
  end
end

私が電話するとき:

 - Phone.first.zipcode

クエリは常に:

 - SELECT "zipcodes".* FROM "zipcodes" WHERE "zipcodes"."area_code" IS NULL LIMIT 1

- - - - 編集 - - - -

class Zipcode < ActiveRecord::Base
  attr_accessible :area_code, :city, :zip_code

  has_many :phones, :finder_sql => Proc.new {"SELECT DISTINCT phones.* FROM phones WHERE '#{area_code}' = substr(phones.phone_number, 1,3);"}

end

------一部の回避策の可能性---------

Michaelが指摘したように、新しいバージョンのRailsでは、DBの参照キーが必要です。

したがって、考えられる回避策

Phone.select("phones.*, "substring(phones.area_code, 1, 3) as area_code_id").first.zipcode

それが誰かを助けることを願っています...

4

2 に答える 2

0

どうやら、唯一の方法は手動で関連付けを定義することです。

class Phone < ActiveRecord::Base
  attr_accessible :phone_number

  def zipcode
    Zipcode.where(:area_code => area_code_id)
  end

  def area_code_id
    phone_number[0..2]
  end

end
于 2012-08-29T12:50:53.540 に答える
0

モデルを変更できるのであればid、電話番号や市外局番など、「ビジネス上の意味」をまったく持たないidフィールド(と呼ばれる)を使用する必要があると思います。

その後、設定を削除できprimary_keyます。

次に、その特定のフィールドに一意性などの検証を追加します。

あるレールバージョンで機能し、別のバージョンでは機能しなかったのは苦痛だと思いますが、この機能を将来に向けて機能させるための正しいルートはおそらく上記のとおりです。Railsは、それらをオーバーライドするための内部動作を詳細に理解していない限り、実際には規則に従うことに依存します。

于 2012-08-29T13:08:32.510 に答える