用户有很多好习惯。如果有一天他错过了他的习惯,那么他应该点击这里:
习惯/ _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 %>
然后他被重定向到:
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 。
感谢您的帮助!
答案 0 :(得分:1)
这取决于你想要对miss_days信息做的所有事情。您可以做一些hacky,比如将所有错过的日期存储为json(或者甚至只是以逗号分隔的字符串!)并将它们全部存储在missed_days_date
列中。
就关系数据库设计而言,正确的方法是拥有一个新的missed_dates
表,其中包含以下字段:id
,date_missed
,{{1} }。
然后,在您的rails模型中,level_id
Level
和has_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。