rails 3.0中的多个范围

Posted

技术标签:

【中文标题】rails 3.0中的多个范围【英文标题】:Multiple scope in rails 3.0 【发布时间】:2011-10-23 20:48:18 【问题描述】:

我是 Rails 的初学者,但我对范围有疑问。

我的班级有 2 个作用域:

class Event < ActiveRecord::Base
  belongs_to :continent
  belongs_to :event_type 

   scope :continent, lambda  |continent|
     return if continent.blank?
     composed_scope = self.scoped
     composed_scope = composed_scope.where('continent_id IN ( ? )', continent).all
     return composed_scope
   

   scope :event_type, lambda  |eventType|
     return if eventType.blank?
     composed_scope = self.scoped
     composed_scope = composed_scope.where('event_type_id IN ( ? )', eventType).all
     return composed_scope
   

结束

在我的控制器中,我想同时使用这 2 个作用域。我做到了:

def filter
  @event = Event.scoped
  @event = @event.continent(params[:continents]) unless params[:continents].blank?
  @event = @event.event_type(params[:event_type]) unless params[:event_type].blank?

  respond_with(@event)
end

但我不工作,我有这个错误:

 undefined method `event_type' for #<Array:0x7f11248cca80>

这是因为第一个作用域返回一个数组。

我该怎么做才能让它发挥作用?

谢谢!

【问题讨论】:

【参考方案1】:

您不应在作用域中附加“.all”:

它通过触发 SQL 查询将可链接的 ActiveRelation 转换为数组。

所以简单地删除它。

奖金:

一些重构:

scope :continent, lambda  |continent|   
  self.scoped.where('continent_id IN ( ? )', continent) unless continent.blank?

【讨论】:

【参考方案2】:

我认为您的作用域中不需要 .scoped。

def filter
  @event = Event.scoped
  @event = @event.continent(params[:continents]) unless params[:continents].blank?
  @event = @event.event_type(params[:event_type]) unless params[:event_type].blank?

  respond_with(@event)
end

在上面的代码中,您已经将所有内容都返回为“作用域”。 另外,您的范围不需要“除非”,因为只有当您的参数不是空白时才会调用它们。所以你的作用域可能会变成这样

scope :continent, lambda  |continent|   
  where('continent_id IN ( ? )', continent)

或者,在更多 Rails 3 方式上,

scope :continent, lambda  |continent_id|
  where(:continent_id => continent_id)

这要短得多:)

【讨论】:

以上是关于rails 3.0中的多个范围的主要内容,如果未能解决你的问题,请参考以下文章

Rails,如何在它们之间使用“and”运算符链接范围?

Rails 3中的范围与类方法

访问用户密码:Rails 中的变量范围

如何修复弃用警告:类级别方法将不再继承 Rails 6.1 中的范围?

如何使用 Arel(大概)创建一个不影响 Rails 3 中的查询的 ActiveRecord 范围?

如何将参数传递给 Rails 4 中的 has_many 关联范围?