【问题标题】:How to associate "missed_days" with a date?如何将“missed_days”与日期相关联?
【发布时间】:2015-08-31 00:30:33
【问题描述】:

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

习惯/_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

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

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

    但是,就关系数据库设计而言,正确的方法是创建一个新的missed_dates 表,其中包含以下字段:iddate_missedlevel_id

    然后,在您的 Rails 模型中,Level has_many :missed_datesMissedDate belongs_to :level

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

    这种方式前期工作量更大,并且涉及额外的表格/模型,但从长远来看,这将是最灵活的。例如,稍后,您可能想找出用户每天错过的原因(例如,缺少时间、太懒、忘记等) - 如果您采用 hacky 解决方案,这将非常困难。如果您采用正确的解决方案,这就像在您的 missed_dates 表中添加一个新的 reason 列一样简单。

    【讨论】:

    • 非常感谢您帮助我顺利完成任务。我喜欢你关于用户原因的建议。我可能会在不久的将来实现它,我会感谢你的:] 你认为我应该如何转换 &lt;%= link_to 'Submit'.html_safe, habit_level_days_missed_index_path({ habit_id: @habit, level_id: @habit.current_habit_level.id }) %&gt;?当您说“您的DaysMissedController 将成为您的MissedDatesController”时,我只是感到困惑,这是否意味着我几乎可以将创建操作复制到新控制器中?再次感谢!
    • 您可以 - 但请记住,您现在还必须在该操作中创建新的 MissedDay 记录。所以你必须进行修改才能做到这一点。
    • 你有几分钟时间和约书亚聊天吗?现在正在为此苦苦挣扎。 chat.stackoverflow.com/rooms/88433/…
    • 我现在正在工作。如果你的项目是开源的,并且在 github 之类的地方,我可能会在接下来的几天里抽出时间来看看。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-12-03
      • 1970-01-01
      • 2020-04-15
      • 2021-03-13
      • 2014-10-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      相关资源
      最近更新 更多