Rails中如何使用association关联替代Supply类的movements实例方法
Rails 关联替换实现方案
你只需要修改Supply类中的关联声明即可,无需调整SupplyMovement的现有代码:
class Supply < ApplicationRecord has_many :movements, ->(supply) { # 移除has_many默认生成的`supply_id = ?`查询条件,因为我们没有对应外键字段 unscope(where: :supply_id) .where(from_supply_id: supply.id) .or(where(to_supply_id: supply.id)) }, class_name: 'SupplyMovement' end
注意事项
- 定义完成后调用
supply.movements的效果和你之前写的实例方法完全一致,还支持后续链式调用其他SupplyMovement的作用域、查询条件 - 上面的写法适配Rails 5及以上版本,如果你使用的是更早的Rails版本,可以把where条件替换为手写SQL字符串的写法:
where('from_supply_id = :supply_id OR to_supply_id = :supply_id', supply_id: supply.id) - 这种带实例参数的关联默认不支持
includes/eager_load预加载,如果有批量查询预加载的需求,需要自己手动实现批量预加载逻辑,或者引入第三方gem辅助实现 - 你原来写的
around_supply作用域如果没有其他地方调用可以直接删除,不影响关联使用
内容的提问来源于stack exchange,提问作者Marat
相关产品推荐
相关产品推荐

