RoR: friendly_id уникальный для пользователя

У меня есть веб-сайт, который работает на предпосылке:

example.com/user_id/news/slug-for-article

По умолчанию я включил уникальные слаги для статей, однако я хотел бы, чтобы слаги были уникальными для каждого пользователя для всех пользователей.

Неуникальность обрабатывается с помощью @user.articles.friendly.find(param).

Как я могу настроить это так, чтобы оно обеспечивало уникальность, но только для определенного атрибута?


person Ashley    schedule 05.07.2013    source источник


Ответы (2)


Я бы использовал friendly_id.

Это будет выглядеть так:

class Article < ActiveRecord::Base
  extend FriendlyId
  belongs_to :user

  friendly_id :name, use: :scoped, scope: :user, slug_column: :permalink

Если кто-то выберет такое же название статьи, friendly_id рассчитает slug, которое не конфликтует с существующим.

Так, например:

  1. Статья с идентификатором #1 под названием «Привет» будет иметь постоянную ссылку /user_id/news/hello.
  2. Статья с идентификатором #2, названная также "Привет", будет иметь постоянную ссылку /user_id/news/hello-2.

Если вы не хотите использовать этот драгоценный камень, вы можете просто использовать Rails проверки.

Это будет выглядеть так:

class Article < ActiveRecord::Base
  extend FriendlyId
  belongs_to :user

  validates_uniqueness_of :permalink, scope: :user_id

Старый добрый validates_uniqueness_of.

Я надеюсь, что это помогает.

person etagwerker    schedule 07.07.2013
comment
Спасибо, но это то, что я уже делаю. Мне нужно, чтобы слаг был уникальным в зависимости от отношения - person Ashley; 07.07.2013
comment
А validates_uniqueness_of :permalink, scope: :user_id не работает? - person etagwerker; 07.07.2013

AЕсли у вас есть ассоциация has_many through:, вы можете сохранить слаг в третьей модели... это единственное место, где вы можете хранить данные, уникальные как для пользователя, так и для статьи.

    @user.articles_users.friendly.find(param).each do |association|
      Articles.find(association.article_id)
    end
person SteveTurczyn    schedule 05.07.2013