【问题标题】:Argument error in model scope模型范围内的参数错误
【发布时间】:2017-09-21 19:19:12
【问题描述】:

我正在尝试重构 Companies_Controller#index 方法,通过将大部分查询移动到一个范围 company_search_params 中来包含更少的逻辑。

将参数传递给模型范围的最佳方法是什么?我收到一个错误,参数数量错误(给定 0,预期为 1)。我对编写范围相对较新,并且在传递适用于 Rails 指南的参数/条件方面找不到太多内容。

公司控制人

 def index
    params[:name_contains] ||= ''
    Company.company_search_params(params[:name_contains])

    @search = Company.company_search_params
    @companies = @search.page(params[:page])
  end

公司模式

scope :company_search_params, ->(name_contains){
    where(
    <<-SQL
      "name LIKE :match OR subdomain LIKE :match", { match: "%#{name_contains}%" }
    SQL
    ).where(is_archived: false).order(name: :asc)
  }

感谢您的帮助。

【问题讨论】:

  • 为什么你同时拥有Company.company_search_params(params[:name_contains])@search = Company.company_search_params?第一个什么都不做,因为您正在关注返回值,第二个导致您的错误。
  • @muistooshort 谢谢你,我没有发现冗余并意识到它是压倒一切的。

标签: sql ruby-on-rails ruby scope


【解决方案1】:

使用 named_scope 示例和信息

scope :named_scope, lambda {
  |variable1, variable2|
  where...
  order...
}

#when you call it from your controller

Model.named_scope("value 1","value 2")

解决你的问题

在你的公司.rb

scope :company_search_params, lambda { 
  |name_contains|
  where(
  <<-SQL
    "name LIKE :match OR subdomain LIKE :match", { match: "%#{name_contains}%" }
  SQL
  ).where(is_archived: false).order(name: :asc)
}

company_controller.rb

def index
  @search = Company.company_search_params(params[:name_contains])
  @companies = @search.page(params[:page])
end

【讨论】:

  • 谢谢@widjajayd
猜你喜欢
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 2015-03-22
相关资源
最近更新 更多