将逻辑转移到模型

时间:2013-10-01 15:17:18

标签: ruby-on-rails model-view-controller ruby-on-rails-4

在我的Rails 4应用程序中,我开始将我的逻辑移到模型上(处理Fat Model原理)。但是,我对如何最好地解决基础知识有点不确定。

我的应用程序显示已登录用户的预订。在我的 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

预订模型如下所示:

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

我收到未定义的方法`confirmed_bookings'错误,不知道我做错了什么。对此的修复以及一些简单的“启动”建议将非常感激。

2 个答案:

答案 0 :(得分: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

请注意,最好不要完全引用用户,因为这是为了住宿。

答案 1 :(得分:2)

如果您将confirmed_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