2011-07-26 87 views
0

我使用的转换宝石创造在我的模型状态机设置像这样:查询由状态机状态的Rails 3

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 

但是,这似乎并没有工作,我无法在此找到文档。有谁知道如何做到这一点? (我相信这可能只是无法找到它)在此先感谢!

编辑

运行尾-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/[email protected]/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/[email protected]/gems/actionpack-3.0.9/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (6.6ms) 
Rendered /Users/dshipper/.rvm/gems/[email protected]/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

tail -n 500 development.log,grep'current_state db/schema.rb – Anatoly

+0

该命令不起作用(我在Leopard上),但我将其更改为:tail -n 500 development.log | grep'current_state db/schema.rb'并且没有返回结果 – dshipper

+0

这是两个不同的系统命令 – Anatoly

回答

0

我还在研究状态机,虽然我还没有在我的项目中实现它,但我发现这可能会有所帮助。

  1. 确保您的Gemfile包括

    gem "transitions", :require => ["transitions", "active_record/transitions"] 
    
  2. 确保你的模型具有

    include ActiveRecord::Transitions 
    

    ,而不是仅仅

    include Transitions 
    

    ,它有一个名为“列状态'这一点是国家坚持的地方。


的问题似乎已经记录在这里:

http://dev.netizer.pl/transitions-state-machine-for-rails-3.html/comment-page-1#comment-41

而且在GitHub上的文档还概述了Rails的

http://github.com/qoobaa/transitions

使用设置w ^第i个Rails的

这进入你的Gemfile:

宝石 “过渡”,:要求=> [ “转换”, “active_record /转换”]

......这到您的AR模型:

包括的Act​​iveRecord ::转变

关于持久性的注意事项

用于保持模型状态的属性被命名为state(真的!),它应该是一个足够宽的字符串列,以适应您最长的状态名称。还应该提到#save!在每一次成功事件后都会被调用

希望这是有益的,祝你好运!