我有一个User
模型和一个与其关联的Enrollment
模型。一个用户可以有多个注册,但每个注册只有一个Company
。
我的Enrollment
模型有一个flag_contractor
布尔值。因此,如果我进行User
搜索,如:enrollment_flag_contractor false
,我可能会得到不一致的结果,因为我正在尝试(通过Apartment gem)确定当前公司的注册范围。
例如,我有一个用户在两个独立的公司注册,一个公司的flag_contractor=true,另一个公司为flag_contrator=false。
我已经确定了User
模型的范围,只让用户在当前公司注册,但Ransack似乎仍然在关联中进行深入搜索,并在所有注册中进行搜索。
我尝试在我的Enrollment
型号中添加一个Ransack范围:
scope :active, -> (company_id) { where(company_id: company_id) }
然后修改了我的用户控制器:
@users = @search.result(distinct: true, active: current_company.id).paginate(:page => params[:page])
但没有成功。
我认为这可能是最好的答案,因为这是做到这一点的唯一方法(可能也是最好的)。
以下是我现在在User
模型中的作用域:
scope :enrolled_old, -> { joins(:companies).where("companies.tenant_name = '#{Apartment::Tenant.current}'") }
scope :enrolled, -> (company_id) { joins(:enrollments).where("enrollments.company_id = '#{company_id}'") }
旧的不起作用。不知道为什么。如果我将company_id传递到作用域中,作用域就会起作用。他们似乎都在控制台上工作。
所以现在在我的Pundit用户政策中,我有:
company = Company.where(tenant_name: Apartment::Tenant.current).last
User.joins(:enrollments).where("enrollments.company_id = '#{company.id}'")
这是有效的,它实际上有助于更好地锁定我的政策。