首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多租户应用程序中的acts_as_list -如何设置范围?

多租户应用程序中的acts_as_list -如何设置范围?
EN

Stack Overflow用户
提问于 2013-11-25 21:13:11
回答 1查看 385关注 0票数 0

问题

我在一个多租户应用程序中使用acts_as_list。我使用这个Railscast:#388多租户与Scopes (订阅所需的)对多租户进行建模。

我需要确保我的around_filter工作,这样租户就不会影响其他租户的数据。

由于acts_as_list忽略了default_scope?,因此对acts_as_list实施多租户的作用范围的最佳方法是什么?

背景

基本思想是在around_filter中使用application_controller.rb,如下所示:

代码语言:javascript
复制
class ApplicationController < ActionController::Base
  include SessionsHelper
  around_filter :update_current_tenant

  #current_tenant is defined in sessions_helper.rb, included above
  def update_current_tenant
    Tenant.current_id = current_tenant.id if current_tenant
  end
end

这样,每次在应用程序中加载页面时,都会设置current_tenant,我可以使用default_scope来限制对current_tenant的访问。如下所示:

代码语言:javascript
复制
  default_scope { where(tenant_id: Tenant.current_id) }

但是acts_as_list使用Model.unscoped (在本例中是Submission.unscoped),它绕过了my default_scope。

下面是我正在研究的具体模型:

代码语言:javascript
复制
class Submission < ActiveRecord::Base
  default_scope { where(tenant_id: Tenant.current_id) }

  acts_as_list scope: [:for_date, :tenant_id] # Works, but is this safe?

  # The one below is closer to what I want, but it bombs 
  #acts_as_list :scope => 'for_date = #{for_date} AND tenant_id = #{Tenant.current_id}'
end

我在其他几个地方这样做,但是我使用id列而不是for_date,所以acts_as_list声明如下:

代码语言:javascript
复制
acts_as_list :scope => 'task_id = #{task_id} AND tenant_id = #{Tenant.current_id}'

效果很好。但是,当我尝试使用提交模型并将for_date包含在acts_as_list作用域中时,我会得到以下错误:

代码语言:javascript
复制
PG::UndefinedFunction: ERROR:  operator does not exist: date = integer
LINE 1: ... (submissions.position IS NOT NULL) AND (for_date = 2013-11-...
                                                           ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
: SELECT  "submissions".* FROM "submissions"  WHERE (submissions.position IS NOT NULL) AND (for_date = 2013-11-25 AND tenant_id = 1) ORDER BY submissions.position DESC LIMIT 1

我将如何添加这样一个显式的类型广播?还是有更好的方法来做这件事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-25 23:21:17

结果,我只需要转义for_date (我想是因为它是带有单引号的“日期”数据类型,而不是整数数据类型,但我不确定):

代码语言:javascript
复制
acts_as_list :scope => 'for_date = \'#{for_date}\' AND tenant_id = #{Tenant.current_id}'

这招成功了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20203437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档