Ruby / Rails генератор уникальных имен - PullRequest
0 голосов
/ 03 августа 2010

У меня есть модель User, которая has_many Documents. Название каждого документа должно быть уникальным в пределах области действия пользователя. Это работает как ожидалось.

class Document < ActiveRecord::Base
  has_many :documents, :dependent => :delete_all
end

class Document < ActiveRecord::Base
  belongs_to :user
  validates_presence_of :title
  validates_uniqueness_of :title, :scope => :user_id
end

Когда я клонирую документ, я хочу убедиться, что его заголовок уникален. OSX добавит «copy» к документу, который копируется в Finder. Если имя объекта оканчивается на «copy», к нему добавляется увеличенное числовое значение, начиная с 2 (например, «foo copy 2»). Я хотел бы воспроизвести это поведение.

Кажется, мне нужно сделать следующее в действии копирования ResumeController:

  1. получить коллекцию документов пользователя
  2. извлечение заголовков в массив
  3. поиск в массиве заголовка нового объекта
  4. если заголовок не найден, сохранить объект
  5. если заголовок найден (может быть многократным, например, 'foo Copy', 'foo Copy 2'), добавьте 'Copy' в конец заголовка или увеличьте число. Шаблон регулярного выражения 'Copy [0-9] * $', кажется, находит правильное соответствие.

В данный момент логика копирования находится в ResumeController, но, кажется, более уместно добавить ее в модель документа.

Любой совет приветствуется.

Ответы [ 2 ]

0 голосов
/ 10 августа 2010

Я решил, что самым простым решением было бы просто добавить «копировать ГГГГММДДЧЧММСС» в конец имени файла, где «ГГГГММДДЧЧММСС» заменяется значением даты и времени.

0 голосов
/ 03 августа 2010

Вместо того, чтобы перетягивать весь список документов и перебирать их, лучшим способом было бы найти:

def controller_method_name
  ...
  title = params[:title]
  d = Document.find(:first, :conditions => ["title = :title", {:title => title.strip}]

  if !d.nil?
    #your safe, no document with this title exists
  else
    #pass the title to the Document model and generate a new name
  end
  ...
end

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

...