1

短いバージョン:私は、使用中の従来のRails 2アプリケーションで使用されているデータベースの一部のテーブルを(読み取り専用で)使用する新しいRails 4アプリケーションを構築しています。しかし、(特に新しいアプリケーションの文脈で)古いアプリケーションモデル/テーブルは非常に混乱していましたので、self.table_nameを使用してモデル/テーブルに異なる名前を使用したいと思います。これは多相関係を追加しようとするまで完全に機能します。 Railsは私の定義したtable_nameを無視し、新しいモデル名を使ってその型の問い合わせを行いますが、それはもちろん違いますので動作しません。これを変更する方法はありますか?Rails 4の多型has_manyがtable_nameを無視します

ロングバージョン:あり、この式の3つのモデルがあり、ここで彼らは、次のとおりです。

class Exporter < MysqlBase 
    has_many :lic_exporter_addresses, :as => :place 

    self.table_name = 'excons' 
    self.primary_key = 'id' 
end 

class LicBusiness < MysqlBase 
    has_one :physical_address, -> { where(category: 'Physical') }, :class_name => 'LicExporterAddress', :as => :place 
    has_one :mailing_address, -> { where(category: 'Mailing') }, :class_name => 'LicExporterAddress', :as => :place 
    has_many :lic_exporter_addresses, :as => :place 

    self.table_name = 'businesses' 
    self.primary_key = 'id' 
end 

class LicExporterAddress < MysqlBase 
    belongs_to :place, polymorphic: true 

    self.table_name = 'addresses' 
    self.primary_key = 'id' 
end 

私たちは、企業のさまざまな種類のトンを持っているので、ビジネスモデルが最も問題です。私は本当に "ビジネス"が実際に何であるかについて非常に混乱するので、新しいアプリでそれを持っていることを本当に望んでいない。現在のコードでは、私はレールコンソールにアクセスし、LicBusinessや輸出業者のためのlic_exporter_addressesを取得しようとすると、それはありません:

SELECT `addresses`.* FROM `addresses` WHERE `addresses`.`place_id` = '00044c693f6848f9b0978f873cf9999a' AND `addresses`.`place_type` = 'LicBusiness' 

私は必要なのplace_type =「ビジネス」です。

Railsにどのようなplace_typeを探すかを教える方法はありますか?私はこれを見たquestionと二番目の答えは、私はすでにそれが両方のオプションで同時に動作する方法を把握することはできませんので、物理アドレスと郵送のアドレスでそれをやっていることを除いて有望見えた...ありがとう任意の情報やアイデアのために。

答えて

2

Rails 4.2では、クエリに使用される正確な文字列がowner.class.base_class.nameと定義されているように見えます。ownerは、関連付けを宣言するモデルです。だから私はそれが直接サポートされているとは思わない。しかし、私はこれをハックするために考えることができるいくつかの方法があります。私はLicBusinessで、最も有望なのかもしれないと思う:

ある
has_many :lic_exporter_addresses, ->{where place_type: "Business"}, foreign_key: "place_id" 

、多型などの関連付けを定義しますが、種類の範囲を自分で定義していません。 lic_exporter_address.place = some_lic_business_instanceを使用した場合、lic_exporter_addressesテーブルにplace_typeが正しく定義されません。しかし、あなたはこのテーブルは読み取り専用だと言っていますので、実際にはこのテーブルは問題ではないかもしれません。そうであれば、必要なものを得るために動作を変更する方法があるかもしれません。

他の2つのアイデアの両方が私を非常に緊張させ、意図しない副作用に対してはおそらくかなり危険だと思います。彼らはLicBusiness.base_classをオーバーライドする必要があります(これは実際には今ではないかもしれませんし、STIがLicBusinessに設定されることはありませんが、私はまだ緊張しています)、またはLicBusiness.nameを上書きすることになりますエフェクト)。

+0

ありがとうございました。これは厳密には読み取り専用です(他のアプリケーションはこのデータの実際の管理を行う必要があります)ので、place_typeが新しいエントリに正しく入力されることに心配していません。 physical_addressとmailing_addressについても同様に機能しました。 {category: 'Physical'、place_type: "Business"}}、:class_name => 'LicExporterAddress'、foreign_key: "place_id" has_one:physical_address、 – Maltiriel

関連する問題