2012-03-09 6 views
0

複数のオブジェクトの複合体である2つのモデルがあります。基本的には、保存と更新のために手動で管理しています。ただし、アイテムを選択すると、そのアイテムの関連プロパティにアクセスすることはできません。たとえば、次のようにモデルオブジェクトのどのレベルで、ActiveRecordは関連オブジェクトをロードしません

class ObjectConnection < ActiveRecord::Base 
    def self.get_three_by_location_id location_id 
    l=ObjectConnection.find_all_by_location_id(location_id).first(3) 
    r=[] 
    l.each_with_index do |value, key| 
     value[:engine_item]=Item.find(value.engine_id) 
     value[:chassis_item]=Item.find(value.chassis_id) 
     r << value 
    end 
    return r 
    end 
end 

と各項目:

class Item < ActiveRecord::Base 
    has_many :assets, :as => :assetable, :dependent => :destroy 

私はObjectLocation.find_three_by_location_idを使用する場合は、他のほとんどの状況でItem.find(ID)を使用する場合のに対し、私は資産へのアクセスを持っていません、 私がやります。

私はインクルードを使ってみましたが、それはそう思わなかったのです。

THX

答えて

1

はそうのように簡単にアクセスするために、あなたのObjectConnectionモデルにメソッドを追加することです最も簡単な解決策のように聞こえる:

class ObjectConnection < ActiveRecord::Base 

    def engine 
    Engine.find(engine_id) 
    end 

    def chassis 
    Chassis.find(chassis_id) 
    end 

    # rest of class omitted... 

私はあなたが求めているものを正確にわからないんだけど...これがあなたが求めているものに答えることができないなら、あなたが達成しようとしていることを少しだけ明確にしようとすることができますか? ChassisEngine mdoelsはItemモデルとの多型関連であるはずですか?

また、モデルでプロパティを動的に設定しようとしているため、上で使用しているコードは機能しません。 Item.findへの電話が失敗しているのではなく、value[:engine_item]=value[:chassis_item]への呼び出しが失敗しています。あなたはその流れ維持したい場合は、このようなものにするためにそれを修正する必要があります:

def self.get_three_by_location_id location_id 
    l=ObjectConnection.find_all_by_location_id(location_id).first(3) 
    r=[] 
    l.each_with_index do |obj_conn, key| 
    # at this point, obj_conn is an ActiveRecord object class, you can't dynamically set attributes on it at this point 
    value = obj_conn.attributes # returns the attributes of the ObjectConnection as a hash where you can then add additional key/value pairs like on the next 2 lines 
    value[:engine_item]=Item.find(value.engine_id) 
    value[:chassis_item]=Item.find(value.chassis_id) 
    r << value 
    end 
    r 
end 

をしかし、私はまだによる事実のために、この全体の方法は、不要と思われると思います、もしあなたObjectConnectionモデルにあなたのセットアップの適切な団体まず始めに、あなたがここでやろうとしているように、手動でアソシエーションを処理する必要はありません。

+0

エンジンとシャーシの両方が「アイテム」で、「belongs_to:item、:foreign_key => 'engine_id」、belongs_to:item、:foreign_key =>「chassis_id」は使用できません。それは関係が「has_one」であるように見えますが、正直なところ、これをモデル化する方法は私を少し超えています。エンジンとシャーシは多形ではありません。現在、is_engine、is_chassisのステータスフィールドがあります。この部分は間違いなくちょっと醜いですが、モデリングの仕方はアプリの他の部分でもうまく機能します。 – timpone

+0

'Item'をスーパークラスにして、' Item'のサブクラスである 'Engine'と' Chassis'モデルを別々に作るのが一番良いと思います。 'Item'クラスのために'多態性 '関係を指定します(これは他のクラスに細分されます)。 [ここではActiveRecordの多型関係についてもっと読む](http://guides.rubyonrails.org/association_basics.html#polymorphic-associations)をrailsのdocサイトで読んでください。あなたが本当にあなたの現在の設定(私はお勧めしません)に固執したい場合は、私の変更された答えの下部を読んでください。 – Batkins

+0

あなたが言及しているコードの一部が正常に動作し、正しいデータが表示されます。 – timpone

関連する問題