Как нумеровать проекты последовательно для каждого пользователя в Ruby on Rails 3? - PullRequest
1 голос
/ 19 февраля 2012

Я довольно новичок в Ruby on Rails 3 и только начал создавать небольшое приложение, где пользователи могут управлять своими проектами и задачами.

Очевидно, что все проекты и задачи должны быть скрыты от общественности и должны быть видны только пользователю, который их создал.

Я нахожу это довольно сложным для понимания, хотя. Например, если один пользователь создает свой первый проект, он будет доступен через URL /projects/1. Если другой Пользователь создаст свой первый Проект через пять секунд, он появится под /projects/2.

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

Кроме того, как мне выложить свои ресурсы?

Я думал о чем-то вроде этого:

resources :users do
  resources :projects
  resources :tasks
end

Это хороший способ начать?

Ответы [ 4 ]

1 голос
/ 19 февраля 2012

Важной частью разработки приложений на основе базы данных является то, что вы должны думать, что идентификаторы базы данных ваших моделей (проектов, задач и т. Д.) Являются случайными числами. Они ничего не значат.

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

Если вы принимаете вышеуказанные передовые методы проектирования, тогда:

Когда создается новый проект, вы должны использовать фильтры или метод "Фабрика", чтобы определить значение для поля "номер_проекта" проекта. Например, для данного пользователя они должны быть последовательными. Но вы также должны решить, что делать, если проект удален пользователем. Вы хотите, чтобы номер проекта был повторно использован?

Другая проблема, на которую вы, похоже, намекаете в вопросе, - это разрешения: должен ли пользователь 1 видеть проекты / задачи / и т. Д. Пользователя 2? Если нет, то используйте драгоценный камень, такой как cancan или аналогичный для управления разрешениями.

Третья возможная проблема - это URL, которые будут использоваться вашим проектом. Стандартный принцип UX - игнорировать форматы URL, как я отмечал выше. Но если вы действительно хотите, вы можете сделать их "красивыми". Есть несколько драгоценных камней, чтобы помочь с этим. См список

1 голос
/ 19 февраля 2012

Для начала я бы получил самое высокое значение в фильтре before_create, а затем сгенерировал бы новое число.

class Project < ActiveRecord::Base
  belongs_to :user

  before_create :set_per_user_id

  private
    def set_per_user_id
      val = user.projects.maximum(:document_id)
      self.document_id = val + 1
    end
end

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

(с вашими маршрутами все в порядке)

1 голос
/ 19 февраля 2012
Код

Торстена будет работать для установки document_id проекта, но вам все равно придется переопределить способ загрузки ресурса при действиях контроллера редактирования, обновления, показа и уничтожения, например ::100100 *

def show
  @user = User.find params[:user_id]
  @project = @user.projects.find_by_document_id params[:id]
  render
end

Честно говоря, если только наличие этих идентификаторов для пользователя не является огромным требованием, я бы не советовал делать это таким образом. Это нарушает соглашение по rails и причинит боль, если вы попытаетесь использовать библиотеки, такие как cancan , для авторизации доступа к ресурсам.

1 голос
/ 19 февраля 2012

У вас может быть два идентификатора: настоящий скрытый id и общедоступный consecutive_id. Затем в своих действиях вам нужно будет сделать что-то похожее на это:

def show
  id = params[:id]

  # instead of
  #   project = Project.find(id)
  # you now do this
  project = Project.where(user_id: current_user.id, consecutive_id: id).first

  # proceed
end

Если вы пойдете по этому пути, вам придется самостоятельно устанавливать последовательность идентификаторов. Используйте before_create обратный вызов, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...