2009-03-25 39 views
7

Cách tốt nhất để duy trì trạng thái của đối tượng đến cơ sở dữ liệu khi chuyển đổi bằng aasm? Tôi đã nghĩ rằng điều này sẽ xảy ra tự động nhưng điều này dường như không đúng.Kéo cột trạng thái vào quá trình chuyển đổi bằng rubyist-aasm (hoạt động như máy trạng thái)

(Edit: khi tôi tự lưu các đối tượng, cột trạng thái không được cập nhật Nhưng tiết kiệm không được thực hiện trên chuyển tiếp..)

tôi không thể tìm thấy tài liệu rất hữu ích cho plugin này, vì vậy nếu bạn có một gợi ý cho việc thực thi máy hữu hạn khác với tài liệu tốt hơn, điều đó cũng có thể giúp ích.

Trả lời

14

Nếu bạn gọi số nổ! hình thức của phương thức sự kiện chuyển tiếp, trạng thái sẽ vẫn tồn tại. Ví dụ, nói rằng bạn có một đối tượng với sự kiện sau:

class Book < ActiveRecord::Base 
    # ... 

    aasm_event :close do 
    transitions :to => :closed, :from => [:opened] 
    end 

    # ... 
end 

Calling book.close sẽ thiết lập nhà nước để closed, nhưng sẽ không tự động lưu. Gọi số book.close! sẽ đặt trạng thái * và * tự động lưu đối tượng AR.

-3

Tôi nghĩ bạn phải lưu trong quá trình chuyển đổi nếu đó là hiệu ứng bạn muốn. ActiveRecord (mà aasm đang ngồi trên đầu trang) không tự động lưu các bản ghi, theo thiết kế.

Bạn có thể thực hiện lưu trong callback nếu bạn muốn (và có vẻ như bạn đang làm).

+0

Cảm ơn bạn, đó là những gì tôi cần. Có vẻ như một số ngày tôi không thể nghĩ ra những từ lạ mắt như 'gọi lại';) – Angela

+2

Điều này là không cần thiết. Tất cả các sự kiện chuyển tiếp có một phương pháp bang sẽ tự động lưu giữ hồ sơ. Xem câu trả lời của tôi để biết thêm thông tin. –

0

Tôi tin rằng AASM sẽ duy trì trạng thái của đối tượng sau khi chuyển đổi. Xem các dòng 180-189 trong aasm/lib/persistence/active_record_persistence.rb

4

Như Colin gợi ý, AASM sẽ tiếp tục thay đổi cho bạn. Điều mà Markus nói là không chính xác, ngoại trừ việc phiên bản mới nhất của viên đá quý có lỗi.

On line 180 của lib/bền bỉ/active_record_persistence.rb (bạn có thể có được điều này bằng cách chạy đá quý: giải nén), bạn sẽ thấy những nhận xét, trong đó nêu:

Ghi nhà nước vào cột nhà nước và vẫn tồn tại nó vào cơ sở dữ liệu bằng cách sử dụng update_attribute (bỏ qua xác thực)

Tuy nhiên, trong mã, nó thực sự gọi là lưu thay thế!

unless self.save 

Lỗi xảy ra khi mô hình cơ sở không xác thực, vì phương pháp lưu không bỏ qua xác thực theo mặc định. Thay vào đó, khắc phục nhanh là thực hiện việc này:

unless self.save(false) 

Bây giờ, chuyển tiếp thực sự lưu trạng thái mới vào cơ sở dữ liệu.

Các vấn đề liên quan