The database migrations:
class CreateMachines < ActiveRecord::Migration def change create_table :machines do |t| t.string :name t.integer :state_id t.timestamps end end end class CreateStates < ActiveRecord::Migration def change create_table :states do |t| t.string :name end end endThe models/machine.rb:
class Machine < ActiveRecord::Base belongs_to :state validates_presence_of :state_id endAnd the models/state.rb:
class State < ActiveRecord::Base has_many :machines endThe controllers/machines_controller.rb:
class MachinesController < ApplicationController def index respond_to do |format| format.html { @machines = Machine.includes(:state).order("machines.name ASC") } format.js { @machines = Machine.where("machines.updated_at >= :updated_at", { :updated_at => session[:last_status_request] }).includes(:state) } end session[:last_status_request] = Time.now end endIf a simple GET request was received by the MachinesController, it returns all machines including their state and sets the request timestamp in the session initially. They are displayed in the views/machines/index.html.erb:
<ul> <% machines.each do |machine| %> <li> <%= machine.name %>: <span id="<%= dom_id(machine) %>_state"><%= machine.state.name %></span> </li> <% end %> </ul> <%= link_to 'Refresh', machines_path, :remote => true, :class => 'auto_remote' %>The XMLHTTPRequest triggered by the remote link reaches the format.js part of the MachinesController. Please notice that only those machines are queried, who have been updated since the last status request timestamp. So a lot less machines and their state are queried, instantiated and sent back to the client.
The result is processed in the index.js.erb:
<% @machines.each do |machine| %> state = $('#<%= dom_id(machine) %>_state'); state.text("<%= machine.state.name %>"); <% end %>This post was more about the conception how to save processing time than an optimized-to-the-bones tutorial. For example you better should render a 304 Not Modified, if no state was updated since the last polling request.
Supported by Ruby on Rails 3.2.8