3

我是 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
   }

结尾

在我的控制器中,我想同时使用这两个范围。我做了:

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>

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

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

谢谢 !

4

2 回答 2

3

你不应该在你的范围内附加“.all”:

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

因此,只需将其删除。

奖金:

一些重构:

scope :continent, lambda { |continent|   
  self.scoped.where('continent_id IN ( ? )', continent) unless continent.blank?
}
于 2011-08-10T08:01:52.380 回答
0

我认为您不需要 .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)
}

这要短得多:)

于 2011-12-16T13:56:20.750 回答