如何在 Ruby Sunspot 中定义动态作用域?

发布于 2024-12-06 15:08:19 字数 563 浏览 0 评论 0原文

我想通过“所有”过滤器或“任何”过滤器来搜索曲目。所以这就是我得到的:

tracks_controller.rb

def search
  if params[:scope] == "any_of"
    Track.search do
      any_of do
        with(:name, "Thriller")
        with(:artist, "Michael Jackson")
      end

      with(:user_id, current_user.id)
    end
  elsif params[:scope] == "all_of"
    Track.search do
      all_of do
        with(:name, "Thriller")
        with(:artist, "Michael Jackson")
      end

      with(:user_id, current_user.id)
    end
end

它按预期工作。但如何重构代码使其变得 DRY 呢?

I want to search the tracks either by "all of" the filters, or by "any of" the filters. So here is what I got:

tracks_controller.rb

def search
  if params[:scope] == "any_of"
    Track.search do
      any_of do
        with(:name, "Thriller")
        with(:artist, "Michael Jackson")
      end

      with(:user_id, current_user.id)
    end
  elsif params[:scope] == "all_of"
    Track.search do
      all_of do
        with(:name, "Thriller")
        with(:artist, "Michael Jackson")
      end

      with(:user_id, current_user.id)
    end
end

It works as expected. But how to refactor the code to make it DRY?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

别闹i 2024-12-13 15:08:19

这是先生:

def search
  Track.search do

    mode = (params[:scope] == 'any_of' ? method(:any_of) : method(:all_of)) # don't use method(params[:scope]) for obvious security reason)

    mode.call do
      with(:name, "Thriller")
      with(:artist, "Michael Jackson")
    end

    with(:user_id, current_user.id)
  end
end

Here it is Sir:

def search
  Track.search do

    mode = (params[:scope] == 'any_of' ? method(:any_of) : method(:all_of)) # don't use method(params[:scope]) for obvious security reason)

    mode.call do
      with(:name, "Thriller")
      with(:artist, "Michael Jackson")
    end

    with(:user_id, current_user.id)
  end
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文