【问题标题】:Querying arrays stored as comma separated strings in active record查询活动记录中以逗号分隔的字符串形式存储的数组
【发布时间】:2013-03-15 06:52:32
【问题描述】:

我必须通过 has_many 关系搜索许多关联模型。为了论证,假设我有一个通过 has_many 关联包含许多类别的 Product 模型。因为我必须对许多父模型的子关联执行此操作,所以我创建了一个缓存表,我将关联中的所有 id 存储为逗号分隔的字符串 - '23,34,56,78' 而不是加入。这也有助于我稍后需要在类别 ID 上使用条件 AND 进行高级搜索。

我的问题是在活动记录中查询此类字符串中是否存在 id 的最佳方法是什么。例如,如果我希望所有父模型的关联 ID 为 34、56 和 78。

要准确搜索一个 id,我必须搜索 '%,34,%', '34,%', '%,34' 来说明 id 可以占据的字符串中的不同位置。有没有更简单的方法?

【问题讨论】:

  • 真的比加入快吗?这似乎是一种奇怪的方法。
  • 哈,好问题。部分问题是我正在按照railscasts.com/episodes/111-advanced-search-form-revised 的方式构建一个搜索系统,因此该系统的另一个优点是简化了涉及带有AND 的has_many 的查询。这有意义吗?
  • 还值得一提的是,搜索方面最终需要查看 6-8 个 has_many 关系。所以我认为缓存表可能会简化事情。
  • 您可能想看看一个非常方便的 gem:github.com/plataformatec/has_scope。它极大地简化了基于请求参数的查询。

标签: ruby-on-rails ruby-on-rails-3 activerecord


【解决方案1】:

我不知道这会有多快,但您可以用逗号分割字符串以创建一个数组,然后在所述数组上执行 .includes?()...但这真的比 SQL 快吗?

value.split(',').includes?(other_value)

或多个项目:

value.split(',') && [id1, id2, id3]

这将返回出现在两个数组中的 id 列表。

【讨论】:

    猜你喜欢
    • 2012-10-30
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多