【问题标题】:Search for slugs across all models using friendly_id models使用 friendly_id 模型在所有模型中搜索 slug
【发布时间】:2018-08-11 18:42:02
【问题描述】:

我在一堆不同的模型中使用FriendlyId。对于带有用户名的特定用例,我不能使用 FriendlyId,但仍想确保在任何这些模型中都不会将用户名用作 slug。

目前,我对每个使用 FriendlyId 的模型都有一个.exists 查询。感觉效率不是很高,所以我想知道是否有更有效的方法,只需查询库创建的friendly_id_slugs 表中的slugs 列?

我使用的是 Rails 5.1、Postgres 9.5.x 和 FriendlyId 5.2.3

【问题讨论】:

    标签: ruby-on-rails activerecord friendly-id


    【解决方案1】:

    @Ben 的回答帮助我找到了理想的解决方案。事实证明,FriendlyId 有一个内部模型 - FriendlyId::Slug,它由 friendly_id_slugs 表支持。

    所以,像下面这样的查询对我有用:

    FriendlyId::Slug.where(
        sluggable_type: ["Animals", "Plants"]
      )
      .where('lower(slug) = ?', potential_username.downcase)
      .exists?
    

    【讨论】:

      【解决方案2】:

      定义一个模型将其映射到它的表,只需创建一个app/models/friendly_id_slug.rb 文件,其中包含:

      class FriendlyIdSlug < ApplicationRecord
      end
      

      然后你得到一个标准的模型活动记录查询方法(FriendlyIdSlug.where…

      Alertnatively,运行原始 sql 将适用:

      ActiveRecord::Base.connection.execute("select * from friendly_id_slugs etc…")
      

      也就是说,您的.exists? 听起来也很公平。如果您为每个模型重复代码,您可以创建一个 app/models/concernsapp/lib 类文件,以便在相关模型中重复使用

      【讨论】:

      • 谢谢本!第一个选项看起来很聪明,也是最干净的。您是否看到声明模型未由库声明的任何副作用(除了库在未来版本中这样做)?
      • 使用 .exists? 选项,我不确定这是否也是性能最高的 - 您的解决方案中的一个查询与使用 exists 的 5-6 个查询?
      • 你知道怎么做了;不知道这个;那么超级干净!
      猜你喜欢
      • 2014-08-20
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 2019-07-29
      相关资源
      最近更新 更多