named_scopes和所有

时间:2010-10-15 17:08:16

标签: ruby-on-rails named-scope

我在Rails 2.3.5上。在我的应用程序内,用户可以预订特定日期的一个或多个时间段。我在Slot模型中定义了这个named_scope:

  # day time slots
  named_scope :for_day, lambda { |day|
    if !day.blank?
      { :conditions => ['day_of_week = ?', day] }
    end
  }

我用它来检索一天中可用的所有“时间段”。 但是我有一个页面,我希望看到所有预订的插槽(换句话说,其他用户的插槽)。

因此,当我拨打/slots网址时,我希望获得每个预订的广告位,而当我拨打/ user / 2 / slots时,我只需要用户2。

我将此路由map.resources :users, :has_many => :slots添加到我的routes.rb中 这段代码发给我的slots_controller.rb:

  def index
    if params[:user_id]
      @slots = User.find(params[:user_id]).slots
    else
      @slots = Slot.all
    end
  end

请注意,用户还可以单独看到其他用户预订的广告位。

现在当我尝试使用上面的:for_day命名范围来获取Slot.all数组时,我得到:

undefined method for_day for #<Array:0x104441f60>

我能够修复它向Slot模型添加named_scope :all, :conditions => {},但这对我来说似乎是一个奇怪的解决方案。

你能帮帮我吗?

1 个答案:

答案 0 :(得分:2)

默认的all方法返回一个数组(而不是关联对象,由named_scope :all返回),因此您无法在其上调用for_day

但是,您可以直接在您为其定义的类上调用命名范围,因此只需执行Slot.for_day(day)(不使用.all)即可解决您的问题。