2010-01-18 34 views
5

Tôi có một bảng có một cột có tên là lifecycle_id và một bảng khác có tên là lifecycle_change_reason. lifeycle_id thường được thay đổi tự động bởi hệ thống dựa trên các yếu tố khác, nhưng một số người dùng có khả năng thay đổi vòng đời theo cách thủ công. nếu có, tôi muốn yêu cầu họ cung cấp lý do để thay đổi, nhưng tôi không muốn yêu cầu trường đó vào bất kỳ lúc nào khác. có ai có một gợi ý cho làm thế nào tôi có thể thực hiện loại xác nhận?làm cách nào để xác thực sự hiện diện của một trường chỉ khi một trường khác được chỉnh sửa trong đường ray?

thx :)

C

Trả lời

0

tôi có thể thấy một vài cách khác nhau. Tôi nghĩ rằng điều tốt nhất là thêm một trường khác vào bảng có tên là lifecycle_id_original. Sau đó, mô hình của bạn sẽ bao gồm mã như thế này:

class Member < ActiveRecord::Base 
    belongs_to :lifecycle 

    validates :lifecycle_change_reason, :if => :lifecycle_changed? 

    before_save :reset_original_lifecycle 

    protected 

    def lifecycle_changed? 
    self.life_cycle_id != self.lifecycle_id_original && !self.lifecycle_id_original.nil? 
    end 

    def reset_original_lifecycle 
    self.lifecycle_id_original = self.lifecycle_id 
    end 
end 

Khi đối tượng (thành viên trong ví dụ này) được xác nhận, lifecycle_change_reason sẽ chỉ được yêu cầu khi bản gốc và lifecycle_id là không giống nhau. Giá trị nil cũng được phép cho giá trị gốc, bởi vì đó là những gì nó sẽ là khi một bản ghi mới được tạo ra.

Sau đó, khi được lưu, "gốc" được đặt để khớp với vòng đời, vì vậy chu kỳ cập nhật tiếp theo sẽ hoạt động bình thường.

Điều này không sạch như tôi muốn. Suy nghĩ đầu tiên của tôi là sử dụng attr_accessor để bản sao không được lưu trữ trong DB tất cả các thời gian, nhưng điều đó sẽ có nghĩa là thiết lập giá trị đó mỗi khi một bản ghi được tải. Tôi không biết về bất kỳ callback kiểu on_load nào cho các mô hình ActiveRecord.

-1

Điều này có vẻ giống như bộ điều khiển. Tôi nhận ra rằng mọi người muốn đẩy logic vào các mô hình và vì lý do chính đáng, nhưng hãy thực dụng ở đây: nếu hệ thống của bạn tự động thay đổi giá trị này và chỉ có một điểm trong hệ thống của bạn. không, theo ý kiến ​​của tôi, giới thiệu tất cả những gì nhiều phức tạp chỉ đơn giản là thực thi sự tồn tại của một lý do trong điều khiển của bạn với một cái gì đó đơn giản như:

if params[:object_name][:life_cycle_id] != @object.life_cycle_id && params[:object_name][:life_cycle_change_reason].blank? 
    flash[:error] = "You must enter a reason for changing the life cycle." 
    redirect_to :back and return false # or whatever 
end 
+0

vấn đề với điều này là bạn không nhận được tất cả các xác nhận lỗi thoải mái xử lý trong hình thức. –

+0

Chắc chắn bạn cũng biết cách thực hiện điều đó: @ object.errors.add (: life_cycle_change_reason, "phải được cung cấp.") Đơn giản. – adriandz

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