Rails - 如何实例化一个具有二级关联的模型?对于实例化的记录,是否有一个替代的<<操作符?

问题描述 投票:0回答:1

上下文。

对于Rails的&ActiveRecord,我的理解是,如果你想让一个实例化的、尚未保存的子记录&其属性通过父记录来访问,你需要通过父记录来实例化子记录。比如说

# when instantiated through parent
order = ParentA.last.orders.new(notes:"asdf")
order.notes
> "asdf"
order.parent_a.present?
> true
order.parent_a.orders.map(&:notes)
> ["asdf"]

# when NOT instantiated through parent
order = Order.new(parent_a_id:ParentA.last.id, notes: "asdf")
order.notes
> "asdf"
order.parent_a.present?
> true
order.parent_a.orders.map(&:notes)
> []

在上面的例子中,我希望第一个场景发生, 但我必须实例化的地方 order 跨越2个父母。ParentAParentB. 即,类似于......

order = ParentA.last.orders.new(notes:"asdf")
ParentB.last.orders << order 

order.parent_a.orders.map(&:notes)
> ["asdf"]
order.parent_b.orders.map(&:notes)
> ["asdf"]

现在,实际上上面的代码确实是在订单有效的情况下工作的,因为要使用的是 << 运营商。order 基本上必须是一个完全有效的子对象。

然而,在我的情况下,我想现在就进行实例化,然后再进行订购。换句话说,我几乎想知道是否有一种替代方法来替代 << 可以在父类上关联一个实例化的子类?

同时注意到 << 操作符也将保存一条额外的记录,如果实例化的 order 对象是有效的,所以根据情况,这可能是坏的。

ruby-on-rails activerecord parent-child
1个回答
0
投票

铲子操作符的意义其实只是隐式关联两个项目。你总是可以直接赋值或外键值。

order = ParentA.last.orders.new(notes:"asdf", parent_b: ParentB.last)
order.save 
ParentB.last.orders.last == order # should be true
© www.soinside.com 2019 - 2024. All rights reserved.