module YeshuaCrm::ActsAsViewed::Viewed::ClassMethods
Public Instance Methods
Create the needed columns for acts_as_viewed. To be used during migration, but can also be used in other places.
# File lib/yeshua_crm/acts_as_viewed/rcrm_acts_as_viewed.rb, line 209 def add_viewings_columns if !self.content_columns.find { |c| 'views' == c.name } self.connection.add_column table_name, :views, :integer, :default => '0' self.connection.add_column table_name, :total_views, :integer, :default => '0' self.reset_column_information end end
Create the viewings table
Options hash:¶ ↑
-
:table_name
- use a table name other than viewings
To be used during migration, but can also be used in other places
# File lib/yeshua_crm/acts_as_viewed/rcrm_acts_as_viewed.rb, line 231 def create_viewings_table(options = {}) name = options[:table_name] || :viewings if !self.connection.table_exists?(name) self.connection.create_table(name) do |t| t.column :viewer_id, :integer t.column :viewed_id, :integer t.column :viewed_type, :string t.column :ip, :string, :limit => '24' t.column :created_at, :datetime end self.connection.add_index(name, :viewer_id) self.connection.add_index(name, [:viewed_type, :viewed_id]) end end
Drop the viewings table.
Options hash:¶ ↑
-
:table_name
- the name of the viewings table, defaults to viewings
To be used during migration, but can also be used in other places
# File lib/yeshua_crm/acts_as_viewed/rcrm_acts_as_viewed.rb, line 251 def drop_viewings_table(options = {}) name = options[:table_name] || :viewings if self.connection.table_exists?(name) self.connection.drop_table(name) end end
Find all viewings for a specific viewer.
# File lib/yeshua_crm/acts_as_viewed/rcrm_acts_as_viewed.rb, line 259 def find_viewed_by(viewer) viewing_class = acts_as_viewed_options[:viewing_class].constantize if !(acts_as_viewed_options[:viewer_class].constantize === viewer) raise ViewedError, "The viewer object must be the one used when defining acts_as_viewed (or a descendent of it). other objects are not acceptable" end raise ViewedError, 'Viewer must be a valid and existing object' if viewer.nil? || viewer.id.nil? raise ViewedError, 'Viewer must be a valid viewer' if !viewing_class.column_names.include?('viewer_id') conds = ['viewed_type = ? AND viewer_id = ?', self.name, viewer.id] acts_as_viewed_options[:viewing_class].constantize.where(conds).collect { |r| r.viewed_type.constantize.find_by_id r.viewed.id } end
Generate the viewings columns on a table, to be used when creating the table in a migration. This is the preferred way to do in a migration that creates new tables as it will make it as part of the table creation, and not generate ALTER TABLE calls after the fact
# File lib/yeshua_crm/acts_as_viewed/rcrm_acts_as_viewed.rb, line 202 def generate_viewings_columns(table) table.column :views, :integer # uniq views table.column :total_views, :integer end
Make the model viewable. The Viewing model, holding the details of the viewings, will be created dynamically if it doesn't exist.
-
Adds a
has_many :viewings
association to the model for easy retrieval of the detailed viewings. -
Adds a
has_many :viewers
association to the object. -
Adds a
has_many :viewings
associations to the viewer class.
Options¶ ↑
-
:viewing_class
- class of the model used for the viewings. Defaults to Viewing. This class will be dynamically created if not already defined. If the class is predefined, it must have in it the following definitions:belongs_to :viewed, :polymorphic => true
belongs_to :viewer, :class_name => 'User', :foreign_key => :viewer_id
replace user with the viewer class if needed. -
:viewer_class
- class of the model that creates the viewing. Defaults to User This class will NOT be created, so it must be defined in the app. Use the IP address to prevent multiple viewings from the same client.
# File lib/yeshua_crm/acts_as_viewed/rcrm_acts_as_viewed.rb, line 78 def rcrm_acts_as_viewed(options = {}) # don't allow multiple calls return if self.included_modules.include?(ActsAsViewed::Viewed::ViewMethods) send :include, ActsAsViewed::Viewed::ViewMethods # Create the model for ratings if it doesn't yet exist viewing_class = options[:viewing_class] || 'Viewing' viewer_class = options[:viewer_class] || 'User' unless Object.const_defined?(viewing_class) Object.class_eval <<-EOV class #{viewing_class} < ActiveRecord::Base belongs_to :viewed, :polymorphic => true belongs_to :viewer, :class_name => #{viewer_class}, :foreign_key => :viewer_id end EOV end # Rails < 3 # write_inheritable_attribute( :acts_as_viewed_options , # { :viewing_class => viewing_class, # :viewer_class => viewer_class } ) # class_inheritable_reader :acts_as_viewed_options # Rails >= 3 class_attribute :acts_as_viewed_options self.acts_as_viewed_options = { :viewing_class => viewing_class, :viewer_class => viewer_class } class_eval do has_many :viewings, :as => :viewed, :dependent => :delete_all, :class_name => viewing_class.to_s has_many(:viewers, :through => :viewings, :class_name => viewer_class.to_s) before_create :init_viewing_fields end # Add to the User (or whatever the viewer is) a has_many viewings viewer_as_class = viewer_class.constantize return if viewer_as_class.instance_methods.include?('find_in_viewings') viewer_as_class.class_eval <<-EOS has_many :viewings, :foreign_key => :viewer_id, :class_name => #{viewing_class.to_s} EOS end
Remove the acts_as_viewed specific columns added with add_viewings_columns
To be used during migration, but can also be used in other places
# File lib/yeshua_crm/acts_as_viewed/rcrm_acts_as_viewed.rb, line 219 def remove_viewings_columns if self.content_columns.find { |c| 'views' == c.name } self.connection.remove_column table_name, :views self.connection.remove_column table_name, :total_views self.reset_column_information end end