2017-08-04 6 views
0

使用 - 次のように子モデルの関連付けを:Railsの選択としての「ネストされたモデルで、私は私が親構造化することができますRailsのスコープを作成しようとしているスコープ

{ 
    id: 1, 
    ...other_child_attrs, 
    parent: { 
    id: 2, 
    ...other_parent_attrs 
    } 
} 

私は「注入」することができたが次のクエリを使用して、childparent属性:

scope :include_parent, -> { Child.joins(:parent).select('childs.*, parents.*') } 

問題は、子属性として、親のネストされた属性は、子属性の一部であるとの衝突を引き起こす可能性がある(同じレベルで注入されていることです子供の中で繰り返される - idcreated_at、など):

{ 
    id: 2, // Notice there's a parent - child id collision 
    ...other_child_attrs, 
    ...other_parent_attrs 
} 

それは)など、構造が直列化宝石、as_jsonに依存することなく、単独のアクティブなレコード/無地SQL(して説明を達成することは可能ですか?

答えて

0

def as_json(options={}) 
    super(:include => { :sales => { 
           :include => { :product => { 
              :only => [:id,:name, :price] } }, 
           :only => :id} }) 
    end 
0

私はこれを複雑過剰あなたがいると思い、それがモデルにas_jsonを使用しない、これを試してみてください。アソシエーションを使用して2つのモデルを適切に設定している場合、あなたは何をしたいのですか。

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

class Parent < ActiveRecord::Base 
    has_one :child 
end 

parent = Parent.create 
child = Child.create(parent_id: parent.id) 

child.to_json(include: :parent) 
=> [{"id":1,"parent_id":1,"created_at":"2017-08-04T20:48:52.056Z","updated_at":"2017-08-04T20:48:52.056Z","parent":{"id":1,"created_at":"2017-08-04T20:47:32.671Z","updated_at":"2017-08-04T20:47:32.671Z"}}] 

child = Child.first 
child.parent 
    Child Load (0.2ms) SELECT "children".* FROM "children" ORDER BY "children"."id" ASC LIMIT ? [["LIMIT", 1]] 
    Parent Load (0.1ms) SELECT "parents".* FROM "parents" WHERE "parents"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] 
=> #<Parent id: 1, created_at: "2017-08-04 20:47:32", updated_at: "2017-08-04 20:47:32"> 
関連する問題