使用Ransack确定关联搜索范围

时间:2015-12-07 08:46:28

标签: ruby-on-rails activerecord ransack

我有User模型,其中Enrollment模型与之关联。用户可以有多个注册,但每个注册只有一个Company

我的Enrollment模型有一个flag_contractor布尔值。因此,如果我有User搜索,例如:enrollment_flag_contractor false,我可能会得到不一致的结果,因为我正在尝试为当前公司(通过公寓宝石)确定我的注册范围。

例如,我的用户在两个独立的公司中注册,一个使用flag_contractor = true,另一个使用flag_contractor = 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])

但没有成功。

1 个答案:

答案 0 :(得分:2)

我认为这可能是最好的答案,因为这是唯一的方式(并且可能是最好的)。

以下是我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}'")

这有效,它实际上有助于更好地锁定我的政策。

相关问题