【问题标题】:Calling method to provide search parameters in Rails model在 Rails 模型中调用方法提供搜索参数
【发布时间】:2012-11-15 03:21:05
【问题描述】:

我有一个带有以下部分的 Rails 控制器:

def search
  ...
  @player_to_team_histories = @player_to_team_histories.order(sort_column + " " + sort_direction)
  ...

sort_columnsort_direction 定义为(@player_to_team_historiesActiveRecordAssociation

private

  def sort_column
    params[:sort] || "players.LastName"
  end

  def sort_direction
    params[:direction] || "asc"
  end

所以从这两个函数返回的文本被插入到@player_to_team_historiesorder 子句中。

我需要在另一个控制器中复制此搜索功能,因此我已将搜索逻辑移至 PlayerToTeamHistories 模型并将 params 哈希作为参数传递给 search 函数。骨架代码:

def self.search_results(params)
 ...
  @player_to_team_histories = @player_to_team_histories.order(sort_column(params) + " " + sort_direction(params))
 ...

我尝试在模块中定义 sort_column(params)sort_direction(params) 并不断收到 undefined method or variable sort_columns 错误,因此我将实现移至模型底部

def sort_column(params)
  params[:sort] || "players.LastName"
end

def sort_direction(params)
  params[:direction] || "asc"
end

并且仍然得到未定义的方法错误。我尝试将其简化为:

def sort_column
  "players.LastName"
end

def sort_direction
  "asc"
end

但这仍然不起作用(我更新了对函数的调用以不使用params)。

知道为什么我不能从模型的另一个函数中调用辅助函数吗?

Rails 3.2.1、Ruby 1.9.2

【问题讨论】:

    标签: ruby-on-rails activerecord model controller


    【解决方案1】:

    如果方法在模型中 - 它们是实例方法。你应该这样称呼它们:

    def self.search_results(params)
     ...
      @player_to_team_histories = @player_to_team_histories.order(@player_to_team_histories.sort_column + " " + @player_to_team_histories.sort_direction)
     ...
    end
    

    【讨论】:

    • 谢谢!作为旁注,控制器方法在某些方面是否特别? (即为什么我不需要在控制器中调用 self.sort_column?)。
    • no - 控制器方法并不特殊。对其进行测试并发布一个示例,以便我们可以解决。还有一件事 - 如果您希望控制器方法可用于多个控制器,您可以定义一个父控制器(从 ApplicationController 继承)并定义这些方法并从它继承;或在 application_controller.rb 中定义您的方法。但我认为这些是更多的模型方法。
    • 我认为它与实例变量有关,正如您所指出的。当您处于控制器操作中时(例如,index),我认为您将获得该控制器的一个实例,因此 self 是隐含的。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 2017-06-08
    相关资源
    最近更新 更多