如何在 Rails 控制台中根据列格式过滤模型

Posted

技术标签:

【中文标题】如何在 Rails 控制台中根据列格式过滤模型【英文标题】:How to filter a model on tha basis of Column Format in Rails Console 【发布时间】:2021-12-14 00:21:56 【问题描述】:

我一直在努力处理基于列格式过滤掉 A 模型(候选)的客户请求

我面临的问题是列输入 SSN 或 EIN。 SSN 的格式为 (xxx-xx-xxxx) EIN 的格式为 (xx-xxxxxxx)

我的候选人表包含字段 ssn_or_ein ,它采用这两个之一。

例如: 候选人111.ssn_or_ein => 111-11-1111 候选人222.ssn_or_ein => 22-2222222

我已尝试获取所有 4000 个帐户,但我认为这不是开发人员应采用的方法。

我仍在学习 Rails,任何提示都会很有帮助。

【问题讨论】:

您的意思是您只想找到拥有 EIN 的人吗?只有 SSN 的人? 是的,这就是我的意思。有一个新的条带更新不允许 EIN。所以我们要更新输入 EIN 的人群 【参考方案1】:

您可以使用like 查询来完成此操作。将其放在scope 中,以便轻松获取。

class Candidate < ApplicationRecord
  scope with_ein ->  where( "ssn_or_ein like ?", "__-_______" 
  scope with_ssn ->  where( "ssn_or_ein like ?", "___-__-____" 
end

但是,如果 ssn_or_ein 未正确编入索引,这可能会变慢。


考虑将它们存储在两个不同的列中。这使得验证和查询更简单。仅当您只需要 TIN - Taxpayer Information Number 时才将它们放在一起。

class Candidate < ApplicationRecord
  scope with_ein ->  where.not( ein: nil ) 
  scope with_ssn ->  where.not( ssn: nil ) 

  EIN_RE = %r^\d2-\d7$
  SSN_RE = %r^\d3-\d2-\d4$
  validates :ein, format:  with: EIN_RE , allow_nil: true
  validates :ssn, format:  with: SSN_RE , allow_nil: true

  def tin
    ssn || ein
  end

  class << self
    def find_by_tin(tin)
      where( ssn: tin ).or( where(ein: tin) )
    end
  end
end

我还建议您将数据“标准化”存储,不带破折号,只存储数字。这更易于使用,并且可以更改接受的格式而无需更改所有数据。将它们格式化为decorator。

【讨论】:

非常感谢!!这很好,我能够获取 SSS 候选人:c_ssn = Candidate.where("ssn_or_ein like ?", "%___-__-____%") 然后我能够映射所需的列但是,对于 EIN,我获取的记录是 EIN 和 SSN 的混合所以,我发现每个 EIN从 8 开始,这完成了工作c_ein = Candidate.where("ssn_or_ein like ?", "%8_-_______%") 我想找出一种方法来过滤 EIN 而不添加 8 作为前缀,以备将来需要 @shashankbarman 除非 ssn_or_ein 字段中的内容比您告诉我们的要多,否则您不需要将 % 添加到类似查询中。 是的,不需要 %。感谢前辈的洞察力

以上是关于如何在 Rails 控制台中根据列格式过滤模型的主要内容,如果未能解决你的问题,请参考以下文章

Rails 模型/控制器结构

如何在控制台中调用rails 3模型方法

如何在项目中重命名 Rails 控制器和模型

如何在 Rails 中使用下拉列表和 ajax 过滤数据

如何直接从 Rails 控制器返回 HTML?

Rails 控制台比较模型实例