如何将“missed_days”与日期相关联?

时间:2015-08-31 00:30:34

标签: ruby-on-rails ruby model-view-controller

用户有很多好习惯。如果有一天他错过了他的习惯,那么他应该点击这里:

习惯/ _habit.html.erb

<%= link_to new_habit_level_days_missed_path({ habit_id: habit, level_id: habit.current_habit_level.id }), id: 'remove_check' do %>
  <span class="glyphicon glyphicon-remove"></span>
<% end %>

enter image description here

然后他被重定向到:

views / days_missed / new.html.erb

<%= simple_form_for(@habit) do |f| %>
  <%= f.date_field :missed_days_date %>
  <%= link_to 'Submit'.html_safe, habit_level_days_missed_index_path({ habit_id: @habit, level_id: @habit.current_habit_level.id }), remote: true, method: 'post', data: { modal: true }, class: 'remove-check', id: 'remove_check' %>
<% end %>

点击Submit后,对 DaysMissedController 的创建操作发出POST请求,该操作会将missed_days增加+1。

class DaysMissedController < ApplicationController
  def new
  end

  def create
    habit = Habit.find(params[:habit_id])
    habit.missed_days = habit.missed_days + 1
    @habit.save!
    level = habit.levels.find(params[:level_id])
    level.missed_days = level.missed_days + 1
    if level.missed_days == 3
      level.missed_days = 0
      level.days_lost += habit.calculate_days_lost + 2
    end
    level.save!
    head :ok # this returns an empty response with a 200 success status code
  end

我们如何将date_field条目与missed_days的每个增量相关联?换句话说,对于每个错过的日子,都应该有一个错过的日期。

这种方式除了显示多少天用户失踪外,我们还会显示用户错过的日子。

分贝

  create_table "habits", force: true do |t|
    t.integer  "missed_days",  default: 0
    t.boolean  "conceal",      default: false
    t.integer  "likes"
    t.datetime "date_started"
    t.string   "trigger"
    t.string   "action"
    t.string   "target"
    t.string   "reward"
    t.integer  "user_id"
    t.datetime "created_at",                                                                      null: false
    t.datetime "updated_at",                                                                      null: false
    t.integer  "order"
    t.datetime "completed_at"
    t.text     "committed",    default: "---\n- sun\n- mon\n- tue\n- wed\n- thu\n- fri\n- sat\n"
  end

  add_index "habits", ["user_id", "created_at"], name: "index_habits_on_user_id_and_created_at", using: :btree
  add_index "habits", ["user_id"], name: "index_habits_on_user_id", using: :btree

  create_table "levels", force: true do |t|
    t.integer  "habit_id"
    t.integer  "missed_days",   default: 0
    t.datetime "missed_days_date"      # How should we integrate this?
    t.integer  "days_lost",     default: 0
    t.integer  "current_level"
    t.datetime "created_at",                null: false
    t.datetime "updated_at",                null: false
  end

路由

  resources :habits do
    resources :levels do
      # This route increments and decrements missed days
      resources :days_missed, only: [:create, :destroy, :new]
    end
  end

以下是 gist

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这取决于你想要对miss_days信息做的所有事情。您可以做一些hacky,比如将所有错过的日期存储为json(或者甚至只是以逗号分隔的字符串!)并将它们全部存储在missed_days_date列中。

就关系数据库设计而言,正确的方法是拥有一个新的missed_dates表,其中包含以下字段:iddate_missed,{{1} }。

然后,在您的rails模型中,level_id Levelhas_many :missed_dates MissedDate

您的belongs_to :level将成为您的DaysMissedController,并且基本上是一个标准CRUD控制器,可在您的MissedDatesController表中创建新记录。您可能希望将现有missed_dates列实施为counter cache column

这种方式在前面需要更多的努力,并涉及额外的表/模型,但它将是最灵活的长期。例如,稍后,您可能想知道用户每天错过的原因(例如,缺乏时间,懒惰,忘记等) - 如果您使用hacky解决方案,这将是很难。如果您使用正确的解决方案,这就像在missed_days表中添加新的reason列一样简单。

答案 1 :(得分:0)

您需要一个新模型MissedDay,它有一个日期,属于Level和User(如果我正确理解您的模型结构)。用户和关卡有很多MissedDays。