【问题标题】:Rails: Writing Search feature for database columnsRails:为数据库列编写搜索功能
【发布时间】:2023-04-04 10:45:01
【问题描述】:

我必须为我的 Rails 应用程序编写搜索功能。我在数据库中有多个列,用户可能希望根据数据库中列的任意组合进行搜索。我现在实施的方式越来越难看。所以我猜这可能有宝石,或者可能有更好的方法来解决这个问题。下面是我的代码的 sn-p。

class Finance < ActiveRecord::Base

  CASH_FLOW = ['Income', 'Expense']
  PAID_BY   = ['Person A', 'Person B']

  validates :amount,    presence: true
  validates :cash_flow, presence: true, inclusion: { in: CASH_FLOW }
  validates :date,      presence: true
  validates :paid_by,   inclusion: { in: PAID_BY }, if: "cash_flow == 'Expense'"
  validates :paid_by,   presence: true, if: "cash_flow == 'Expense'"

  def self.search(id, amount, amount_dropdown, cash_flow, start_date, finish_date, description, paid_by)
    if id.present? && amount.empty? && cash_flow.empty? && start_date.empty? && finish_date.empty? && description.empty? && paid_by.empty?
      Finance.find_by_id(id)
    elsif id.empty? && amount.present? && cash_flow.empty? && start_date.empty? && finish_date.empty? && description.empty? && paid_by.empty?
      Finance.where("amount #{amount_dropdown} ?", amount)
   elsif id.empty? && amount.empty? && cash_flow.present? && start_date.empty? && finish_date.empty? && description.empty? && paid_by.empty?
      Finance.where('cash_flow = ?', cash_flow)
   elsif id.empty? && amount.empty? && cash_flow.empty? && start_date.present? && finish_date.empty? && description.empty? && paid_by.empty?
      Finance.where('date = ?', Date.parse(start_date))
   elsif id.empty? && amount.empty? && cash_flow.empty? && start_date.empty? && finish_date.present? && description.empty? && paid_by.empty?
      Finance.where('date = ?', Date.parse(finish_date))
   elsif id.empty? && amount.empty? && cash_flow.empty? && start_date.present? && finish_date.present? && description.empty? && paid_by.empty?
      Finance.where('date >=  ? and date <= ?', Date.parse(start_date), Date.parse(finish_date))
   elsif id.empty? && amount.empty? && cash_flow.empty? && start_date.empty? && finish_date.empty? && description.present? && paid_by.empty?
      Finance.where('description like ?', "%#{description}%")
   elsif id.empty? && amount.empty? && cash_flow.empty? && start_date.empty? && finish_date.empty? && description.empty? && paid_by.present?
      Finance.where('paid_by = ?', paid_by)
   end
 end

end

目前,我正在检查哪些字段为空,哪些字段存在,并据此编写我的搜索查询。请让我知道如何做得更好。我必须为几乎所有模型实现搜索功能。

【问题讨论】:

  • 您似乎必须确保将一个参数传递给该方法。如果存在多个参数,则它不会返回任何内容。那有意义吗?如果您必须确保在调用方法时,为什么不首先使用特定的查找器?

标签: ruby-on-rails ruby search


【解决方案1】:

我不确定这是一个好主意,尤其是当您要搜索许多模型时。有一些非常可靠的解决方案,开箱即用,比您的解决方案效果更好。

例如,您可以使用 searchkick。它很容易实现并且有很多功能。在你的情况下,它会是这样的:

def Finance
  searchkick

  self.search(....)
    Finance.reindex
    Finance.search ... 
  end
end

查看他们的github,了解如何自定义搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    相关资源
    最近更新 更多