使用friendly_id模型搜索所有模型中的slugs

时间:2018-03-03 18:52:36

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

class FriendlyIdSlug < ApplicationRecord
end

然后,您将获得标准模型活动记录查询方法(FriendlyIdSlug.where…

警告,运行原始sql将适用:

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

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