I coded a module to reuse the logic and named it RecordActivation:
module RecordActivation extend ActiveSupport::Concern self.included do scope :active, where(:active => true) validates_presence_of :active before_validation :activate, :on => :create, :if => Proc.new { |r| r.active.nil? } end def activate self.active = true end def activate! activate save! end def deactivate self.active = false end def deactivate! deactivate save! end endAs an example I created a Task migration:
class CreateTasks < ActiveRecord::Migration def change create_table :tasks do |t| t.string :name t.boolean :active t.timestamps end end end... and included the module into the model:
class Task < ActiveRecord::Base include RecordActivation endLet's go into detail in terms of the module.
Please notice that I extended my module with ActiveSupport::Concern. It resolves module dependencies and should be preferred when it comes to module handling. The second I want to point to, is the snippet which is run, when the module is included:
scope :active, where(:active => true) validates_presence_of :active before_validation :activate, :on => :create, :if => Proc.new { |r| r.active.nil? }It spends a scope to the Task model. So finding all active tasks means:
Task.active.allIf you want to ensure, that the activation flag is qualified, add the validation by validates_presence_of. Also make sure that the flag is set initially before creation by calling the method "activate" (but only if the value is not set already/ still NULL). By default all new created records are active.
Task.new.save!... will create a new active task.
Four instance methods allow to set or reset the boolean flag. Those with an exclamation mark at the end of their name force the saving immediately (following the convention). For example:
Task.active.order("created_at").first.deactivate!will deactivate the oldest task at the database.
That's all.
Supported by Ruby on Rails 3.2.8
Keine Kommentare:
Kommentar veröffentlichen