Запрос по State Machine State Rails 3 - PullRequest
0 голосов
/ 26 июля 2011

Я использую гем Transitions для создания конечного автомата в моей модели, настроенной так:

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    

Я хочу запросить модель, чтобы получить все записи, которые имеют определенное состояние, например ::100100

Batch.where :current_state => :pending

Но, похоже, это не работает, и у меня возникают проблемы с поиском документации по этому вопросу. Кто-нибудь знает как это сделать? (Я уверен, что это возможно, просто не могу найти его) Заранее спасибо!

EDIT

Запуск 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 нет, состояние записи управляется конечным автоматом (точно не известно, где хранится это состояние).

1 Ответ

0 голосов
/ 18 августа 2011

Я также исследовал конечные автоматы и, хотя я еще не реализовал их в своем проекте, я обнаружил, что это может быть полезно.

  1. Убедитесь, что ваш гемфайл содержит

    gem "transitions", :require => ["transitions", "active_record/transitions"]
    
  2. Убедитесь, что ваша модель имеет

    include ActiveRecord::Transitions
    

    , а не просто

    include Transitions
    

    и что у него есть столбец с именем 'state', поскольку здесь сохраняется состояние.

Кажется, проблема была задокументирована здесь:

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

И документация по github также описывает установку для Rails

http://github.com/qoobaa/transitions

Использование с Rails

Это входит в ваш Gemfile:

gem "transitions",: require => ["transitions", "active_record / transitions"]

… и это в вашей модели AR:

включает ActiveRecord :: Transitions

Примечание о постоянстве

Используемое свойстводля сохранения состояния модели называется состояние (на самом деле!), которое должно быть строковым столбцом, достаточно широким, чтобы соответствовать вашему самому длинному имени состояния.Следует также отметить, что #save!вызывается после каждого успешного события.

Надеюсь, это полезно, удачи!

...