ruby-on-rails – 如何在Ruby on Rails 3中组合范围?

ruby-on-rails – 如何在Ruby on Rails 3中组合范围?,第1张

概述我对Rails很陌生,我似乎无法理解这个: 我有各种各样的项目属于各种客户. 在我的Project模型中,我有两个搜索功能: scope :search_by_name, lambda { |fn| where('name LIKE ?', "%#{fn}%") }scope :search_by_client, lambda { |fn| where('client_id LIKE ?', 我对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功能,但有一些宝石可以扩展功能以包含它,例如https://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%'UNIONSELECT "projects".* FROM "projects" WHERE "projects".clIEnt_ID liKE '%misterx'

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

总结

以上是内存溢出为你收集整理的ruby-on-rails – 如何在Ruby on Rails 3中组合范围?全部内容,希望文章能够帮你解决ruby-on-rails – 如何在Ruby on Rails 3中组合范围?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1222023.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存