【问题标题】:Moving Logic to Model将逻辑转移到模型
【发布时间】:2013-10-01 15:17:17
【问题描述】:

在我的 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

Booking 模型如下所示:

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

我收到 undefined method `confirmed_bookings' 错误,不确定自己做错了什么。对此问题的修复和一些简单的“入门”建议将不胜感激。

【问题讨论】:

  • Slicedpan 可以回答您的问题,但也没有理由在您的方法中使用局部变量 bookings
  • 很高兴知道 - 所以我假设结果只是在代码完成时自动返回到控制器 - 不需要显式的 return 语句?
  • ruby 方法总是返回最后计算的表达式的值 - 在这种情况下,一个 ActiveRecord::Relation 对象

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


【解决方案1】:

将你的作用域分成可重用的块:

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

注意,最好不要提及用户,因为这是为了住宿。

【讨论】:

  • 是的,我应该使用控制器从当前用户中提取住宿 ID,然后将住宿 ID 传递给模型,对吗?
  • 我一直想看看范围,但还没有时间——这看起来很有帮助,可能是最有效的方法
  • 或根据您的喜好发送住宿
  • 只是出于兴趣-我的其他一些查询使用参数化搜索(?)-这些可以使用范围方法实现
【解决方案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

【讨论】:

  • 谢谢 - 它有效。注意到模型不能使用 ApplicationController 文件中的 current_user 值 - 我应该将用户作为参数发送给方法还是您知道更好的方法?
  • 发布此内容时正在编辑 Q,传递参数可能是最明智的方式,同样如上所述,您不需要函数体中的局部变量(我在回答中将其删除)
猜你喜欢
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多