我正在使用Transitions gem在我的模型设置中创建状态机,如下所示:
require 'transitions'
class Batch < ActiveRecord::Base
include Transitions
state_machine do
state :pending
state :completed
event :change_state do
transitions :to => :completed, :from => [:pending]
end
end
end
我想查询模型以获取具有特定状态的所有记录,例如:
Batch.where :current_state => :pending
但这似乎不起作用,我在查找文档方面遇到了麻烦。有谁知道如何做到这一点? (我确信它似乎无法找到它)提前谢谢!
修改
运行tail -n development.log给了我:
ActionView::Template::Error (SQLite3::SQLException: no such column: batches.current_state: SELECT "batches".* FROM "batches" WHERE "batches"."user_id" = 1 AND "batches"."current_state" = 'pending'):
3: <%= link_to 'New Batch', new_batch_path %>
4:
5:
6: <% unless @pending_batches.length < 1 %>
7: You have <%= @pending_batches.length %> batches pending on these urls:
8: <% @pending_batches.each do |batch| %>
9: <%= batch.url %>
app/views/batches/index.html.erb:6:in `_app_views_batches_index_html_erb___355556540_17724200__911230187'
app/controllers/batches_controller.rb:8:in `index'
Rendered /Users/dshipper/.rvm/gems/ruby-1.9.2-p180@artsicle/gems/actionpack-3.0.9/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.5ms)
Batch Load (0.5ms) SELECT "batches".* FROM "batches" WHERE "batches"."user_id" = 1 AND "batches"."current_state" = 'pending'
SQLite3::SQLException: no such column: batches.current_state: SELECT "batches".* FROM "batches" WHERE "batches"."user_id" = 1 AND "batches"."current_state" = 'pending'
Rendered /Users/dshipper/.rvm/gems/ruby-1.9.2-p180@artsicle/gems/actionpack-3.0.9/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (6.6ms)
Rendered /Users/dshipper/.rvm/gems/ruby-1.9.2-p180@artsicle/gems/actionpack-3.0.9/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (16.1ms)
SQL (0.2ms) SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
Batch Load (0.3ms) SELECT "batches".* FROM "batches" HAVING "batches"."current_state" = 'pending'
SQLite3::SQLException: a GROUP BY clause is required before HAVING: SELECT "batches".* FROM "batches" HAVING "batches"."current_state" = 'pending'
运行grep'current_state db / schema.rb'不会返回任何结果。我希望尽管因为没有名为current_state的实际列,但是记录的状态由状态机管理(不确定它存储状态的确切位置)。
答案 0 :(得分:0)
我也正在研究状态机,虽然我还没有在我的项目中实现它,但我发现这可能会有所帮助。
确保您的gemfile包含
gem "transitions", :require => ["transitions", "active_record/transitions"]
确保您的模型
include ActiveRecord::Transitions
而不仅仅是
include Transitions
并且它有一个名为'state'的列,因为这是状态持久化的地方。
这个问题似乎已在此处记录:
http://dev.netizer.pl/transitions-state-machine-for-rails-3.html/comment-page-1#comment-41
github上的文档也概述了Rails的设置
使用Rails
这进入你的Gemfile:
gem“transitions”,:require =&gt; [“transition”,“active_record / transitions”]
...这是您的AR模型:
包括ActiveRecord :: Transitions
关于持久性的说明
用于保持模型状态的属性被命名为state(真的!),它应该是一个足够宽的字符串列,以适合您最长的状态名称。还应该提到#save!在每次成功的活动后都会被召唤。
希望这有帮助,祝你好运!