You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:36:02