加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 01:26:38 所属栏目:百科 来源:网络整理
导读:我对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%'
UNION
SELECT "projects".* FROM "projects" WHERE "projects".client_id LIKE '%misterx'

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读