2013-10-01 60 views
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 

预订模式是这样的:

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

我收到一个未定义的方法`confirmed_bookings'错误,不知道我在做什么错误。对此和一些简单的“初学者”建议的修复将非常感激。

+1

Slicedpan有你的问题的答案,但也没有理由在你的方法局部变量'预订'。 – gregates

+0

好的知道 - 所以我假设结果只是在代码完成时自动返回给控制器 - 不需要显式返回语句? – tommyd456

+0

ruby​​方法总是返回最后一个评估表达式的值 - 在这种情况下,一个“ActiveRecord :: Relation”对象 – gregates

回答

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 

注意,它会好得多不是指用户在所有的,因为它是一个住宿。

+0

是的,我应该使用控制器从当前用户提取accommodation_id,然后将住宿ID传递给模型右侧? – tommyd456

+0

我一直在寻找范围,但还没有时间 - 这看起来很有帮助,也许是最有效的方式 – tommyd456

+0

或发送住宿,因为你更喜欢 – apneadiving

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 
+0

谢谢 - 它的工作原理。注意到Model不能像ApplicationController文件那样使用current_user值 - 我应该只是将用户作为参数发送给方法,或者您知道更好的方法吗? – tommyd456

+0

编辑Q当你发布这个,传递参数可能是最明智的方式,也作为上面提到的gregates,你不需要在函数体中的局部变量(我在我的答案中删除它) – Slicedpan

+0

哈哈耶谢谢编辑 – tommyd456