我有一个Rails 3项目.Rails 3带来了Arel,以及重用一个范围来构建另一个范围的能力.我想知道在定义关系时是否有使用作用域的方法(例如"has_many").

我的记录有权限栏.我想构建一个默认的_范围,将我的权限列考虑在内,以便过滤记录(甚至是通过关系访问的记录).

目前,在Rails 3中,默认的_范围(包括我找到的补丁)没有提供一种可行的方法来传递proc(我需要后期变量绑定).是否可以定义一个可以将命名范围传递到其中的has_many?

重用命名范围的 idea 如下所示:

Orders.scope :my_orders, lambda{where(:user_id => User.current_user.id)}
has_many :orders, :scope => Orders.my_orders

或者隐式地编码关系中的命名范围:

has_many :orders, :scope => lambda{where(:user_id => User.current_user.id)}

我只是想用后期绑定来应用默认范围.我更愿意使用Arel方法(如果有),但会使用任何可行的选项.

因为我指的是当前用户,所以我不能依赖在最后一刻没有判断的条件,例如:

has_many :orders, :conditions => ["user_id = ?", User.current_user.id]

推荐答案

我建议你看一下"Named scopes are dead"

作者在那里解释了阿雷尔有多强大:)

我希望这会有帮助.

编辑#2014年3月1日

正如一些 comments 所说,这种差异现在是个人品味的问题.

然而,我个人仍然建议避免将Arel的范围expose 给上层(作为控制器或直接访问模型的任何其他东西),这样做需要:

  1. 创建一个作用域,并通过模型中的方法公开它.该方法就是您向控制器公开的方法;
  2. 如果你从不向你的控制器公开你的模型(因此你在它们上面有某种服务层),那么你就没事了.反腐败层可以访问您的服务,它可以访问您模型的作用域,而不必太担心作用域是如何实现的.

Ruby-on-rails相关问答推荐

有没有一种方法可以点击一个按钮来冒泡到父元素?

会话控制器中的某种问题

为特定操作使用布局

在哈姆尔与当地人进行局部渲染?

如何在 Rails 3 中使用 Capybara 单击具有相同文本的第二个链接?

jbuilder vs rails-api/active_model_serializers 用于 Rails 4 中的 JSON 处理

Rails:在 lib 目录中记录代码?

是否有不涉及删除 Gemfile.lock 的在任何源中找不到 *gem*错误的修复?

如何让空白复选框作为假传递给参数

Rails 引擎中的迁移?

Elastic Beanstalk Ruby/Rails 需要安装 git,所以 bundle install 可以工作.. 但不是

如何将变量 link_to 定义为外部 URL

我收到在扫描下一个令牌时发现无法启动任何令牌的字符

如何使用 Rspec 判断 ActiveJob 中排队的内容

在rails国际化yml文件中传递变量

rails respond_to format.js API

Rails - 邮件,将正文作为纯文本获取

使用 Rspec 测试关联的正确方法?

如何拆分长行的 Ruby

Date.current 和 Date.today 有什么区别?