上下文。
对于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个父母。ParentA
和 ParentB
. 即,类似于......
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
对象是有效的,所以根据情况,这可能是坏的。
铲子操作符的意义其实只是隐式关联两个项目。你总是可以直接赋值或外键值。
order = ParentA.last.orders.new(notes:"asdf", parent_b: ParentB.last)
order.save
ParentB.last.orders.last == order # should be true