5

機能するメソッドを作成しましたが、エレガントではありません。私はより良い方法を逃したかどうか疑問に思っています。

私はそのように設定されたポリモーフィックな関連付けを持っています。

class Employee < ActiveRecord::Base
  has_many :phones, as: :phoneable
end

class Client < ActiveRecord::Base
  has_many :phones, as: :phoneable
end

class Phone < ActiveRecord::Base
  belongs_to :phoneable, polymorphic: true
end

私の電話テーブルには標準phoneable_id:integerphoneable_type:string列があります。

私がやりたいことは、以前に選択した従業員グループのすべての電話を取得することです。

employees = Employee.where role: 'peon'

これが通常のhas_many関係である場合、電話クエリを次のように記述します。

Phone.where employee_id: employees

ポリモーフィックな関係でこれを行うために、クエリを次のように記述しました。

Phone.where phoneable_type: 'employee', phoneable_id: employees

これはうまくいきますが、明示的にphoneable_type. Rails には、従業員のコレクションが表示されたときにこれを自動的に行う方法がありますか?それとも単純さを求めすぎているのでしょうか?

4

2 に答える 2

-1

あなたは、ポリモーフィック アソシエーションの重要性を完全には理解していませんでした。モデルで定義している場合は、次のようにレコードを簡単に取得できます。

従業員テーブルに「Peon」ロールがあると仮定しましょう。

@employee = Employee.where(role: 'peon').first

これで、次のようにレコードを取得できます。

 @employee.phones

「peon」ロールを持つ従業員のすべての電話を取得する場合は、次のように実行できます。

@employees = Employee.where(role: 'peon')   

@peon_phones = @employees.map{|x| x.phones}

Client の場合も同様 :

@client = Client.first

@client.phones

あなたが想像するのと同じくらい簡単です。それが役立つことを願っています.Thanks

于 2013-09-07T08:08:45.123 に答える