insiki
@insiki
broken pipe

Как правильно сделать «статус» для задачи?

Есть задачи - объекты модели Task. У задач может быть статус: "в работе", "ожидает", "выполнена" (может какие еще).

1. Добавить поле "status" в таблицу tasks и описать в модели методы для изменения статуса и использовать их во вьюшках?
2. Или создать модель "Status" с полем "title", сделать связь через 3ю таблицу:
class Task 
habtm :statuses

class Status 
habtm :tasks

Затем создать контроллер и добавить статусы через написанные вьюхи или админку?

Как на практике делаются такие вещи?
С одной стороны из курса по реляционным базам в университете помню, что данные не должны повторяться, нормализация, все дела, с другой - не слишком ли много действий для создания всего нескольких записей?
  • Вопрос задан
  • 988 просмотров
Решения вопроса 4
Dem1
@Dem1 Куратор тега Ruby on Rails
Ruby on Rails developer
Может подойдут конечные автовамы гем aasm
Ответ написан
Комментировать
@thepry
Ruby on rails, 1С разработчик
Если тебе нужно хранить историю изменения статусов и возможность откатывать их назад - то стоит делать отдельную таблицу. Если нет - то просто поле в таблице с задачами. Историю приоритетов хранить вряд ли нужно т.ч. можно сразу делать поле в задачах.

class Status
belongs_to :task

из курса по реляционным базам в университете помню, что данные не должны повторяться, нормализация, все дела,


Если статус belongs_to :task - то это озаначает, что под каждую задачу будет запись с таблице статусов, в которой еще и значение этого статуса нужно будет хранить.

Для нормализации можно сделать 3 таблицы - в одной статусы, в другой задачи, а в третьей указывать какие статусы каким задачам принадлежат. Ну еще и время можно для истории.

Но такое стоит делать, если подразумевается возможность создания произвольных статусов пользователями приложении. Если же нет и никакой истории хранить не надо, то делай просто поле в таблице с задачами.
Ответ написан
@askhat
Статус это – состояние, состояние это – стейт, стейт это – state machine
Ответ написан
insiki
@insiki Автор вопроса
broken pipe
Сделал, используя AASM.
Модель:
class Task < ActiveRecord::Base

  include AASM

  aasm :column => 'status' do
    state :in_work, :initial => true
    state :completed

    event :run do
      transitions :from => :completed, :to => :in_work
    end

    event :complete do
      transitions :from => :in_work, :to => :completed
    end
  end

Контроллер:
class TasksController < ApplicationController
  before_action :find_task, only: [:show, :edit, :update, :destroy, :run, :complete]
  def run
    @task.run!
    redirect_to tasks_path
  end
  def complete
    @task.complete!
    redirect_to tasks_path
  end

Представление:
<% @tasks.each do |task| %>
    <% if task.in_work? %>
      <%= link_to 'Complete', complete_task_path(task), method: :put %>
    <% else %>
      <%= link_to 'Run', run_task_path(task), method: :put %>
    <% end %>
<% end %>

Роутинги:
resources :tasks do
    member do
      put :run
      put :complete
    end
  end
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы