如何在Ruby on Rails 3中巧妙组合日期范围查询?

2026-04-11 17:291阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计533个文字,预计阅读时间需要3分钟。

如何在Ruby on Rails 3中巧妙组合日期范围查询?

我对Rails感到陌生,似乎无法理解它:我有很多不同类型的属于各种客户的项目。在我的Project模型中,我有两个搜索功能:+ scope :search_by_name, -> { |fn| fn.where('name LIKE ?', %#{params[:search]}%) }

我对Rails很陌生,我似乎无法理解这个:

我有各种各样的项目属于各种客户.

在我的Project模型中,我有两个搜索功能:

scope :search_by_name, lambda { |fn| where('name LIKE ?', "%#{fn}%") } scope :search_by_client, lambda { |fn| where('client_id LIKE ?', fn) }

两者似乎都有效.例如,在URL中,我可以传递此查询:

/projects?search_by_name=fooproject

我同样可以这样做:

/projects?search_by_client_name=misterx

这将产生属于客户端MisterX的所有项目.

现在有一种方法可以将这两个搜索功能组合在一起以便进行查询

/projects?search=foofoo

将检索名为foofoo的项目以及属于名为foofoo的客户端的项目?

谢谢你的帮助!

在SQL中,您可以按多个条件进行搜索.您已定义了两个作用域,它们可以按如下方式链接在一起:

Project.search_by_name('fooproject').search_by_client('misterx')

这将创建以下SQL:

SELECT "projects".* FROM "projects" WHERE "projects".name LIKE '%fooproject%' AND "projects".client_id LIKE '%misterx'

加入这两个条件的运算符是“AND”,这意味着结果将是满足两个条件的结果,而不是任何一个条件.

有几种方法可以检索具有特定名称的项目或属于客户端的项目.最简单的方法是创建一个指定OR运算符的新作用域:

scope :search_by_name_or_client, lambda { |name, client| where('name LIKE ? OR client_id LIKE ?', "%#{name}%", "%#{client}%") }

您可能还想查看SQL UNION,它结合了两个或多个select语句的结果集. ActiveRecord不处理UNION功能,但有一些宝石可以扩展功能以包含它,例如github.com/tsmango/union

使用Union gem编写此示例的示例如下所示:

Project.union([{:conditions => ['name like ?', "%#{name}%"]}, {:conditions => ['client like ?', "%#{client}%"]}])

这将生成以下SQL:

SELECT "projects".* FROM "projects" WHERE "projects".name LIKE '%fooproject%' UNION SELECT "projects".* FROM "projects" WHERE "projects".client_id LIKE '%misterx'

有关SQL UNION的更多信息,请访问:www.w3schools.com/sql/sql_union.asp

如何在Ruby on Rails 3中巧妙组合日期范围查询?

本文共计533个文字,预计阅读时间需要3分钟。

如何在Ruby on Rails 3中巧妙组合日期范围查询?

我对Rails感到陌生,似乎无法理解它:我有很多不同类型的属于各种客户的项目。在我的Project模型中,我有两个搜索功能:+ scope :search_by_name, -> { |fn| fn.where('name LIKE ?', %#{params[:search]}%) }

我对Rails很陌生,我似乎无法理解这个:

我有各种各样的项目属于各种客户.

在我的Project模型中,我有两个搜索功能:

scope :search_by_name, lambda { |fn| where('name LIKE ?', "%#{fn}%") } scope :search_by_client, lambda { |fn| where('client_id LIKE ?', fn) }

两者似乎都有效.例如,在URL中,我可以传递此查询:

/projects?search_by_name=fooproject

我同样可以这样做:

/projects?search_by_client_name=misterx

这将产生属于客户端MisterX的所有项目.

现在有一种方法可以将这两个搜索功能组合在一起以便进行查询

/projects?search=foofoo

将检索名为foofoo的项目以及属于名为foofoo的客户端的项目?

谢谢你的帮助!

在SQL中,您可以按多个条件进行搜索.您已定义了两个作用域,它们可以按如下方式链接在一起:

Project.search_by_name('fooproject').search_by_client('misterx')

这将创建以下SQL:

SELECT "projects".* FROM "projects" WHERE "projects".name LIKE '%fooproject%' AND "projects".client_id LIKE '%misterx'

加入这两个条件的运算符是“AND”,这意味着结果将是满足两个条件的结果,而不是任何一个条件.

有几种方法可以检索具有特定名称的项目或属于客户端的项目.最简单的方法是创建一个指定OR运算符的新作用域:

scope :search_by_name_or_client, lambda { |name, client| where('name LIKE ? OR client_id LIKE ?', "%#{name}%", "%#{client}%") }

您可能还想查看SQL UNION,它结合了两个或多个select语句的结果集. ActiveRecord不处理UNION功能,但有一些宝石可以扩展功能以包含它,例如github.com/tsmango/union

使用Union gem编写此示例的示例如下所示:

Project.union([{:conditions => ['name like ?', "%#{name}%"]}, {:conditions => ['client like ?', "%#{client}%"]}])

这将生成以下SQL:

SELECT "projects".* FROM "projects" WHERE "projects".name LIKE '%fooproject%' UNION SELECT "projects".* FROM "projects" WHERE "projects".client_id LIKE '%misterx'

有关SQL UNION的更多信息,请访问:www.w3schools.com/sql/sql_union.asp

如何在Ruby on Rails 3中巧妙组合日期范围查询?