我有一个应用程序,由几个部门使用,其中每个部门都有一组单独的数据。所以我得到了许多带有division_id
字段的模型,表明该行所属的分割。
每个用户也都有分区信息,因此当他们登录时,我必须根据分区过滤数据。因此,我的代码中有很多地方可以执行此操作,例如:
Contact.where(division_id: current_user.division_id)
我的问题是如何重构这段代码?首先我考虑过使用ActiveRecord的default
范围,但由于division_id
是控制器特定的数据,这似乎不对。有什么想法吗?
答案 0 :(得分:1)
我不确定您为什么说division_id
是控制器特定的数据,因为它看起来像是从User对象(current_user.division_id
)获得除法。无论如何,最好的办法可能就是在这里使用范围,然后重复范围。例如:
# app/models/contact.rb
scope :for_user_division, -> user { where(division_id: user.division_id }
但它仍然会重复呼唤,例如。
Contact.for_user_division(current_user)
无处不在。主要优点是,如果您需要添加类似于稍后仅考虑active?
分区的内容,您现在可以在一个位置更改范围规则。
我不认为有需要也不想进一步干这个。一般来说,我认为默认范围是一件坏事,因为在这种情况下,一点点重复有助于提醒自己你的处理是什么 - 一组有限的联系人。
<强>更新强> 如果您发现自己在多个模型中编写相同的范围,那么您可以通过将其放入关注点并根据需要将其包含到每个模型中来确定干燥范围。