在我的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'错误,不知道我做错了什么。对此的修复以及一些简单的“启动”建议将非常感激。
答案 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