- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们如何将 t.integer :missed
与 t.text :committed
集成,以便
当用户在 :level
中检查他 :missed
3 :committed
天时,他必须重新启动 :级别
?
对于他检查的每个 :missed
天,都会将额外的 :committed
天添加回 :level
以便进阶前一定要补上?
在“精通”
之前,每个习惯都有 5 个级别!
class Habit < ActiveRecord::Base
belongs_to :user
before_save :set_level
acts_as_taggable
serialize :committed, Array
def self.comitted_for_today
today_name = Date::DAYNAMES[Date.today.wday].downcase
ids = all.select { |h| h.committed.include? today_name }.map(&:id)
where(id: ids)
end
def levels
committed_wdays = committed.map { |day| Date::DAYNAMES.index(day.titleize) }
n_days = ((date_started.to_date)..Date.today).count { |date| committed_wdays.include? date.wday }
case n_days
when 0..9
1
when 10..24
2
when 25..44
3
when 45..69
4
when 70..99
5
else
"Mastery"
end
end
private
def set_level
self.level = levels
end
end
我猜我们必须在这里区分 :missed
和 :missed
,这取决于它指的是什么级别。
习惯/_form.html.erb
<label> Missed: </label>
<div>
<label> Level 1: </label>
<%= f.check_box :missed %>
<%= f.check_box :missed %>
<%= f.check_box :missed %>
</div>
<div>
<label> Level 2: </label>
<%= f.check_box :missed %>
<%= f.check_box :missed %>
<%= f.check_box :missed %>
</div>
<div>
<label> Level 3: </label>
<%= f.check_box :missed %>
<%= f.check_box :missed %>
<%= f.check_box :missed %>
</div>
<div>
<label> Level 4: </label>
<%= f.check_box :missed %>
<%= f.check_box :missed %>
<%= f.check_box :missed %>
</div>
<div>
<label> Level 5: </label>
<%= f.check_box :missed %>
<%= f.check_box :missed %>
<%= f.check_box :missed %>
</div>
habits_controller.rb
class HabitsController < ApplicationController
before_action :set_habit, only: [:show, :edit, :update, :destroy]
before_action :logged_in_user, only: [:create, :destroy]
def index
if params[:tag]
@habits = Habit.tagged_with(params[:tag])
else
@habits = Habit.all.order("date_started DESC")
@habits = current_user.habits
end
end
private
def habit_params
params.require(:habit).permit(:missed, :left, :level, :date_started, :trigger, :target, :positive, :negative, :tag_list, :committed => [])
end
end
_create_habits.rb
class CreateHabits < ActiveRecord::Migration
def change
create_table :habits do |t|
t.integer :missed
t.integer :level
t.text :committed
t.datetime :date_started
t.string :trigger
t.string :target
t.string :positive
t.string :negative
t.references :user, index: true
t.timestamps null: false
end
add_foreign_key :habits, :users
add_index :habits, [:user_id, :created_at]
end
end
:committed
完美运行,但现在 :missed
毫无用处。请帮助我添加适当的逻辑以将 :missed
与 :committed
集成。
非常感谢您抽出宝贵时间!
@Dimitry_N 的回答没有达到这个问题的 1) 或 2),就像我试图让它发挥作用一样。也许你会更幸运地融入他的逻辑。通过他的回答,我也得到了这个错误:How to fix level.rb to work with :committed days?
最佳答案
我认为程序设计必须稍微重新评估一下。我相信levels
和 days
应该是带有类似 level
列的独立模型和 missed
(遵循@dgilperez 在他的评论中提到的 SRP 的概念)。因此,我们最终得到四个模型:User
, Habit
, Level
和 Day
, 具有以下关联:
has_many :habits
, has_many :levels
belongs_to:user
, has_many :levels
和 has_many :days, through: :levels #for being able to access Habit.find(*).days
belongs_to :user
, belongs_to :habit
和 has_many :days
belongs_to :level
, belongs_to :habit
通过这些关联,您可以创建具有嵌套属性 的表单。有一个 awesome RailCast explaining nested forms .
<%= form_for @habit do |habit| %>
<% 5.times.each_with_index do |number, index| %>
<h1>Level <%= index + 1 %></h1>
<%= habit.fields_for :levels do |level| %>
<%= level.fields_for :days do |day| %>
<%= day.label :missed %>
<%= day.check_box :missed %> <br/>
<% end %>
<% end %>
<% end %>
<%= habit.submit "submit" %>
<% end %>
“魔法”发生在 habits_controller
中,看起来像这样:
class HabitsController < ApplicationController
...
def new
@habit = @user.habits.new
@level = @habit.levels.new
3.times { @level.days.build }
end
def create
@habit = @user.habits.new(habit_params)
@levels = @habit.levels
if @habit.save
@habit.evaluate(@user)
redirect_to ...
else
...
end
end
...
private
def habit_params
params.require(:habit).permit(
:user_id,
levels_attributes:[
:passed,
days_attributes:[
:missed,:level_id]])
end
...
end
注意 nested strong params
, @habit.evalulate(@user)
方法,我将在下面展示,以及 3.times { @level.days.build }
调用,它在您的 View 中构建嵌套表单的字段。
habit.evauate(user) 方法:在新的 Habit
之后调用此方法被保存。评估属性并将错过的天数和级别的 ID 附加到用户的 missed_days
和 missed_levels
分别属性。逻辑有点笨拙,因为您会将一个数组附加到另一个数组,因此您可能会想出更有效的方法。同时:
def evaluate(user)
levels.each { |level| level.evaluate }
user.missed_levels << levels.where(passed: false).ids
user.missed_days << days.where(missed: true).ids
user.save
end
请注意对 level.evaluate
的调用,看起来像这样:
def evaluate
if days.where(missed: true ).count == 3
update_attributes(passed: false)
else
update_attributes(passed: true)
end
end
架构看起来像这样:
create_table "days", force: true do |t|
t.integer "level_id"
t.integer "habit_id"
t.boolean "missed", default: false
end
create_table "habits", force: true do |t|
...
t.integer "user_id"
...
end
create_table "levels", force: true do |t|
t.integer "user_id"
t.integer "habit_id"
t.boolean "passed", default: false
end
create_table "users", force: true do |t|
...
t.string "name"
t.text "missed_days" #serialize to Array #serialize to Array in model
t.text "missed_levels" #serialize to Array in model
...
end
别忘了使用 accepts_nested_attributes_for :levels, :days
对于 Habit 模型,和 accepts_nested_attributes_for :days
用户。 <强> Here is a git with all my code. 让我知道。
关于ruby-on-rails - 如何整合:missed days with :committed days in habits. rb?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28799527/
要在标题(或谷歌)中简洁地描述这是一个棘手的问题。我有一个分类表,其中某些列可能会根据置信度列为“已删除”。我想用“未识别”替换任何显示“已删除”的列,后跟第一列中未识别的值以行方式说“掉落”。因此,
我在 VSCode 上使用 pygame 模块,但遇到了 pygame 没有 init 成员的问题。我遵循了 this 的解决方案关联。我编辑了用户设置并添加了 "python.linting
我的问题是如何解决丢失的脚本太旧或丢失!! checking for a BSD-compatible install... /usr/bin/install -c checking whether
我正在使用带有启动器的 Spring Boot。当我错误配置启动器(缺少或定义了错误的值)时,它会打印“缺少 bean”错误消息,而不是“缺少值”。很难找到这个错误。 我的开胃菜看起来像 @Condi
我在 Django 1.7 中遇到问题,我正在尝试将用户保存到表中,但我收到一个错误,指出该表不存在。 这是我正在执行的代码: from django.conf import settings fro
我正在查看 EhCache 统计数据,我看到了这些数字: CacheMisses: 75977 CacheHits: 38151 InMemoryCacheMisses: 4843 InMemoryC
我正在尝试使用这些数据运行 lme 模型: tot_nochc=runif(10,1,15) cor_partner=factor(c(1,1,0,1,0,0,0,0,1,0)) age=runif(
我在 Microsoft Visual Studio C++ 中编写了一个程序,并为此使用了 SFML。我包含了程序所需的正确的 .dll 文件,并将它们复制到“发布”文件夹中。有效。整个程序在我的电
在设置新的Reaction CSR应用程序、一些样板库等过程中。在控制台中收到以下错误:。现在,我不会去修复一些我没有维护的包。我怎么才能找到真正的问题呢?Vite dev Build没有报告错误。
我正在上 React Native 类(class),然后使用 Flow 尝试纠正类(class)中的错误,因为讲师没有使用任何类型检查。 我在 Flow 中遇到了另一个错误,通过在互联网上进行长时间
我想删除图像标签正在寻找的缺失错误。我不想要 ult 标签占位符,试图故意将其保留为空白,直到我使用回形针浏览上传照片。 我已经将 url(:missing) 更改为许多其他内容,例如 nil 等。是
CREATE TABLE customer(customer_id NUMBER(6) PRIMARY KEY , customer_name VARCHAR2(40) NOT NULL , cust
我正在设置 invisible reCAPTCHA在我的 Web 应用程序中并且无法验证用户的响应。 (即使我传递了正确的 POST 参数) 我通过调用 grecaptcha.execute(); 以
我搜索了 these SO results找不到与我的问题相关的任何内容。我怀疑这可能是重复的。 我目前正在 .NET C# 3.5 中编写 Microsoft.Office.Interop.Exce
我在同一行收到两个错误。 Bridge *在 Lan 类中排名第一。我错过了什么? #include #include #include using namespace std; class L
首先,我看到了一些解决方案,但我没有理解它们。我是 QT 的新手,甚至谷歌也没有帮助我。英语不是我的母语 这是在QT Creator 5.6中调试后的报错信息 C2143: syntax error:
有没有办法把表1展开成表2?就是将start_no和end_no之间的每一个整数作为seq_no字段输出,取原表的其他字段组成新表(表2)。 表 1: date source market
我在 Excel (2016) 中制作了一个旭日形图,并希望为所有数据点添加标签。问题是,Excel 会自动丢弃一些标签: 似乎标签被删除是因为数据点太小或标签字符串太长。如何让 Excel 显示所有
在 R 3.0.2 中,missing() 函数可以告诉我们是否缺少形式参数。 如何避免硬编码传递给丢失的变量名称?例如在 demoargs <- function(a=3, b=2, d) {
我试图在 UI 上的某些功能中返回一个按钮,但出现了一个奇怪的错误。有人可以帮忙吗? var div = "View" 我得到的错误是: 参数列表后缺少 )。 最佳答案 onclick="javas
我是一名优秀的程序员,十分优秀!