【问题标题】:Scoping an association search with Ransack使用 Ransack 确定关联搜索范围
【发布时间】:2015-12-07 08:46:28
【问题描述】:

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

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

例如,我有一个用户在两个不同的公司注册,一个是 flag_contractor = true,一个是 flag_contractor = false。

我已经将 User 模型的范围限定为仅包含在当前公司注册的用户,但 Ransack 似乎仍在关联中向下钻取并搜索所有注册。

我尝试将 Ransack 范围添加到我的 Enrollment 模型:

scope :active, -> (company_id) { where(company_id: company_id) }

然后修改了我的用户控制器:

@users = @search.result(distinct: true, active: current_company.id).paginate(:page => params[:page])

但没有成功。

【问题讨论】:

    标签: ruby-on-rails activerecord ransack


    【解决方案1】:

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

    这是我现在在我的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}'")
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      相关资源
      最近更新 更多