我正在学习Rails,并遇到了一个小问题.我正在使用任务列表编写死的简单应用程序,因此模型看起来像这样:
class List < ActiveRecord::Base
has_many :tasks
has_many :undone_tasks, :class_name => 'Task',
:foreign_key => 'task_id',
:conditions => 'done = false'
# ... some validations
end
Run Code Online (Sandbox Code Playgroud)
List模型表有列tasks_counter和undone_tasks_counter.
class Task < ActiveRecord::Base
belongs_to :list, :counter_cache => true
# .. some validations
end
Run Code Online (Sandbox Code Playgroud)
有了这样的代码存在attr_readonly :tasks_counter的List情况下,但我想有未完成的任务计数器为好.是否有任何方法让Rails自动缓存多个计数器.
到目前为止,我已经设法创建TasksObserver了增量或减量Task#undone_tasks_counter,但也许有一种更简单的方法.
我正在通过编写简单的TODO任务应用程序来学习Rails.两种型号是:
class List < ActiveRecord::Base
has_many :tasks, :dependent => :destroy
# ...
end
class Task < ActiveRecord::Base
belongs_to :list
# ...
end
Run Code Online (Sandbox Code Playgroud)
任务在列表下作为嵌套资源进行路由.因此,当用户创建新任务时,会POST向其发送消息/lists/:list_id/tasks.到目前为止,在Tasks#new视图的形式中存在
f.hidden_field :list_id, :value => params[:list_id]
Run Code Online (Sandbox Code Playgroud)
但这是一个可怕的解决方案,因为任何人都可以改变隐藏领域的价值.
这里的约定是什么?我应该把类似的东西
@task.list_id = params[:list_id]
Run Code Online (Sandbox Code Playgroud)
在Tasks#create行动和摆脱隐藏的领域,或许
@task = List.find(params[:list_id]).tasks.new(params[:task])
if @task.save
# ...
end
Run Code Online (Sandbox Code Playgroud)
或者甚至有更好的方式我不知道?
编辑:
是的,有类似的问题,其答案几乎涵盖了我的问题.如果您有不同的请发布.
我无法@JsonValue在枚举类的值参数上应用Jackson的注释:
enum class CancellationReason(@JsonValue val code: String) {
CUSTOMER_RESIGNED("20"),
ERRORS_IN_FOO("21"),
ERRORS_IN_BAR("24");
}
Run Code Online (Sandbox Code Playgroud)
错误消息指出:This annotation in not applicable to target 'value parameter'.有什么问题?