【问题标题】:Query based on attribute's size基于属性大小的查询
【发布时间】:2017-10-20 16:31:24
【问题描述】:

我想知道在 Rails 5 中是否可以对给定长度的属性进行where 查询?

假设我在模型 Post 上有一个名为 tags 的序列化 Array 属性,我想查找该属性中包含 3 个以上项目的所有 posts

我会设想它看起来像这样:

Post.where('tags.size > ?', 3)

如果 ActiveRecord 中有解决方案,那将是一个很大的好处。

【问题讨论】:

  • 一个序列化的数组将只是数据库中一个不透明的 YAML 块,数据库不知道如何处理该 YAML,所以你不走运。在单独的列中手动跟踪tags 的大小,停止使用serialize(毕竟这是一个陷阱)并使用单独的关联表,或者切换到支持数组的数据库(例如PostgreSQL)。我再说一遍:serialize 是一个陷阱,可能会给你带来短期收益,但几乎总是会在你的脸上炸开。
  • 这是合理的建议,谢谢。

标签: ruby-on-rails activerecord rails-activerecord ruby-on-rails-5 ruby-on-rails-5.1


【解决方案1】:

首先,正如@mu 所评论的太短,答案here当您需要查询该属性时不要使用序列化。 再次参考那个答案,你可以试试这样的,

Post.all.select { |post| post.tags.length > 3 }

附:未测试。即使它有效,似乎效率很低。

如果您打算打开以创建一个名为 Tag(当然更好)的关联模型,您可以执行类似的操作

Post.joins(:tags).having('count(tags.id) > 3').group('posts.id')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2019-04-30
    • 2011-06-12
    • 2016-10-31
    • 1970-01-01
    • 2018-05-12
    相关资源
    最近更新 更多