Rails,ActiveRecord,Squeel:检查数组中是不是存在值

Posted

技术标签:

【中文标题】Rails,ActiveRecord,Squeel:检查数组中是不是存在值【英文标题】:Rails, ActiveRecord, Squeel: Check if value exists in arrayRails,ActiveRecord,Squeel:检查数组中是否存在值 【发布时间】:2014-03-24 14:40:01 【问题描述】:

我有 2 个表:“演员”和“角色”。 每个表都有一个名为“种族”的列。一个演员只能有 1 个种族,但一个角色可以有 1 个或多个种族。

例如,假设我想在下面找到所有符合 Actor1 种族的角色: Actor1 - 种族:“亚洲人” 角色 1 - 种族:“亚洲人” Role2 - 种族:['Asian','Caucasian']

这个查询:

Role.where(ethnicity.eq myactor.ethnicity)

会拉起 Role1,但不会拉起 Role2。 我的问题是如何构造一个查询,在本例中将同时提取 Role1 和 Role2?

我已经尝试过:

Role.where(ethnicity.in myactor.ethnicity)

但这似乎不起作用。

如何做到这一点?

【问题讨论】:

【参考方案1】:

要问的第一个问题是如何在 Role 模型上存储种族数组?它是一个序列化的列吗?如果是这样的话,如果您要经常询问种族问题,那么您最好选择 has_many 关系。

您的问题似乎是您正在针对可能是数组字符串的值查询字符串。根据您对上述问题的回答,解决方案可能会有所不同。

一种选择是反转你的

Role.where(ethnicity.in myactor.ethnicity)

成为

Role.where(actor.ethnicity.in myethnicity)

因为这里的数组是角色的种族,而不是演员的种族。现在我不是 100% 熟悉 squeel,但这是我基于所涉及的基本逻辑的答案。

【讨论】:

ethnicity 是 Role 模型上的序列化列。我不会经常使用这个查询,所以我认为我不需要有很多关系。我尝试反转查询,但没有用。还有其他想法吗? 所以,它是一个序列化的列,尤其是偶尔是字符串和偶尔是数组的列的问题是,您基本上不能在其上使用 SQL 逻辑,而这正是 squeel 所基于的。 ((反)序列化发生在 Rails 中,就 SQL 而言,序列化列只是一个 blob)。您可以做的最好的事情是尝试仅通过对 YAML 的文本匹配来实现这一点,尽管这可能是有风险的。 Role.whereethnicity =~ '%- Asian\n%' 之类的东西,但老实说,这有点骇人听闻

以上是关于Rails,ActiveRecord,Squeel:检查数组中是不是存在值的主要内容,如果未能解决你的问题,请参考以下文章

使用 active admin、polyamorous、activerecord 更新 squeel

在 Ruby on Rails 4 中使用 Active Record 或 Squeel Gem 重写 SQL 查询

Rails ActiveRecord 查询不等于

需要帮助重新编写一些最初使用名为 Squeel 的 gem 编写的 Rails DB 查询,具有有效的 SQL

ruby on rails 连接条件(带 squeel)

Squeel 在 Rails 控制台中工作,但不在控制器中。错误:nil:NilClass 的未定义方法“方法”