如何访问未持久化嵌套Item对应的NestedItem连接模型?
如何访问嵌套Item对应的连接模型NestedItem
首先回顾你的模型关联结构:
class Step has_many :step_items has_many :items, through: :step_items end class Item has_one :step_item has_one :step, through: :step_item has_many :nested_items, foreign_key: :parent_item_id has_many :items, through: :nested_items end class StepItem belongs_to :step belongs_to :item end class NestedItem belongs_to :parent_item, foreign_key: :parent_item_id belongs_to :item end
你提到通过step.items.build.step_item可以直接获取StepItem,但嵌套Item构建时无法直接拿到对应的NestedItem,这是因为has_many :items, through: :nested_items这种关联在build时,Rails会隐式创建连接模型,但不会直接暴露给子Item实例。下面提供几种可行的解决方案:
方案1:直接操作连接模型NestedItem
跳过through关联的items.build,直接从父Item的nested_items关联构建,这样可以直接拿到NestedItem实例:
# 先构建父Item parent_item = step.items.build # 构建NestedItem并关联子Item nested_item = parent_item.nested_items.build # 通过NestedItem获取子Item child_item = nested_item.item
此时nested_item就是你需要的连接模型实例,同时child_item已经和父Item建立了关联。
方案2:添加反向关联简化访问
给Item模型添加反向关联,让子Item可以直接获取对应的NestedItem,同时建议重命名原有关联避免混淆:
class Item has_one :step_item has_one :step, through: :step_item # 重命名原items关联为child_items,避免和自身模型名混淆 has_many :nested_items, foreign_key: :parent_item_id has_many :child_items, through: :nested_items, source: :item # 添加反向关联,获取当前Item作为子项时的连接模型 has_one :parent_nested_item, class_name: 'NestedItem', foreign_key: :item_id has_one :parent_item, through: :parent_nested_item end
之后就可以像访问StepItem一样直接获取NestedItem:
parent_item = step.items.build child_item = parent_item.child_items.build child_item.parent_nested_item # => 返回对应的NestedItem实例
补充:通过父Item查找连接模型
如果不想修改模型,也可以在构建子Item后,从父Item的nested_items中匹配查找:
parent_item = step.items.build child_item = parent_item.items.build # 从父Item的未保存nested_items中找到对应子Item的连接模型 nested_item = parent_item.nested_items.detect { |ni| ni.item == child_item }
这种方式无需修改模型,但代码相对繁琐,适合临时场景使用。
内容的提问来源于stack exchange,提问作者user1032752
相关产品推荐
相关产品推荐

