1

在我的 Rails 4 应用程序中,我开始将我的逻辑转移到模型中(根据胖模型原理工作)。但是,我有点不确定如何最好地解决基础问题。

我的应用程序显示登录用户的预订。在我的BookingsController中,我有一个显示已确认预订的操作:

def confirmed
  @bookings = Booking.where(:status => 3, :accommodation_id => current_user.accommodation.id).order('updated_at DESC')
end

但是,我尝试将逻辑移动到控制器,以便BookingsController现在看起来像这样:

def confirmed
  @bookings = Booking.confirmed_bookings
end

Booking模型如下所示:

def confirmed_bookings
  bookings = where(:status => 3, :accommodation_id => current_user.accommodation.id).order('updated_at DESC')
end

我收到一个未定义的方法 `confirmed_bookings'错误,不确定我做错了什么。对此的修复和一些简单的“入门”建议将不胜感激。

4

2 回答 2

3

将作用域拆分为可重用的块:

scope :confirmed, ->{ where(:status => 3) } 
scope :for_user,  ->(user) { where(:accommodation_id => user.accommodation.id) }


def self.confirmed_bookings_for(user)
  confirmed.for_user(user).order('updated_at DESC')
end

请注意,完全不提及用户会更好,因为它是为了住宿。

于 2013-10-01T15:25:45.447 回答
2

如果您将 confirm_bookings 方法更改为

self.confirmed_bookings
  ...
end

[编辑] 错过了有关当前用户的部分,该功能在模型中将不可用,一种解决方案是将其作为参数传递给确认的预订功能:

class Booking < ActiveRecord::Base
  def self.confirmed_bookings_for (user)
    where(:status => 3, :accomodation_id => user.accomodation.id).order('updated_at DESC')
  end
  ...
end

然后在你的控制器中你可以写

@bookings = Booking.confirmed_bookings_for current_user
于 2013-10-01T15:20:32.313 回答