【发布时间】:2018-06-08 09:23:58
【问题描述】:
短版:
有没有办法在 Rails 5.0 中“取消范围”ActiveRecord belongs_to(或其他)关联?
加长版:
我正在开发一个 Rails 项目,其中每个“工作”都分配给一个“部门”以用于组织目的。在大多数情况下,可以根据作业详细信息自动推断部门,但在少数情况下,必须手动将作业分配给不同的部门。
为了解决这个问题,我在 Job 表中添加了一个 department_id 列,目的是让事情按如下方式工作:
- 如果
department_id不为NULL,则照常将作业加入部门。 - 否则,回退到“推断”的作业/部门联接逻辑。
根据Rails documentation,这是可能的:
有时您可能希望自定义 属于。这种定制可以通过范围块来实现。为了 示例:
class Book < ApplicationRecord belongs_to :author, -> { where active: true }, dependent: :destroy end您可以在范围内使用任何标准查询方法 块。
因此,我尝试如下定义关系(为演示目的而简化):
belongs_to :department, -> { unscoped.where(id: 7) }
...想法是.unscoped 将删除默认的where departments.id = [jobs.department_id] 逻辑,从而允许我定义自定义规则。
但是,这实际上并没有取消它的范围;生成的 SQL 是:
SELECT `departments`.*
FROM `departments`
WHERE `departments`.`id` = 11 AND `departments`.`id` = 7
LIMIT 1
我的猜测是在执行自定义查询块之后应用了默认的 WHERE 逻辑,这意味着 .unscoped 没有任何效果。
其他一些事情:
- 我知道只要创建新作业,我就可以简单地将
department_id设置为“预期”值。但是,这将有几个缺点:- 我需要追溯设置数据库中每个现有作业的
department_id(这可能需要相当长的时间)。 - 如果将特定类型的工作重新分配给不同的“默认”部门,则任何现有工作仍将分配给“上一个”部门。
- 同样,如果要更新工作的详细信息以使其属于不同部门的权限,则用户需要手动重新分配它。
- 我需要追溯设置数据库中每个现有作业的
- 我知道我可以在 Job 模型上定义一个方法 - 或自定义范围 - 而不是在此处使用
belongs_to,但就这个问题而言,假设我绝对必须通过 ActiveRecord 关系来执行此操作。
【问题讨论】:
标签: ruby-on-rails-5 rails-activerecord