Skip to content

Commit

Permalink
Add functionality to define a relevance range
Browse files Browse the repository at this point in the history
  • Loading branch information
jleemixbook committed Jul 29, 2011
1 parent 20579ef commit 98537d4
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 17 deletions.
2 changes: 2 additions & 0 deletions lib/tagtical/tag.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ class Tag < ::ActiveRecord::Base
before_validation :ensure_possible_values
validate :validate_possible_values

class_attribute :relevance_range

### CLASS METHODS:

class << self
Expand Down
2 changes: 1 addition & 1 deletion lib/tagtical/taggable/core.rb
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ def save_tags
end

new_tags.each do |tag|
taggings.create!(:tag_id => tag.id, :taggable => self, :relevance => tag_value_lookup[tag].relevance) # Create new taggings:
taggings.create!(:tag => tag, :taggable => self, :relevance => tag_value_lookup[tag].relevance) # Create new taggings:
end
end

Expand Down
42 changes: 28 additions & 14 deletions lib/tagtical/tagging.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,38 @@ class Tagging < ::ActiveRecord::Base #:nodoc:
include Tagtical::ActiveRecord::Backports if ::ActiveRecord::VERSION::MAJOR < 3

attr_accessible :tag,
:tag_id,
:taggable,
:taggable_type,
:taggable_id,
:tagger,
:tagger_id,
:relevance
:tag_id,
:taggable,
:taggable_type,
:taggable_id,
:tagger,
:tagger_id,
:relevance

belongs_to :tag, :class_name => 'Tagtical::Tag'
belongs_to :taggable, :polymorphic => true

validates_presence_of :tag_id
before_validation { |record| record.relevance ||= default_relevance }

validates_presence_of :tag_id, :relevance
validates_uniqueness_of :tag_id, :scope => [:taggable_type, :taggable_id, :tagger_id]

validate :validate_relevance

if Tagtical.config.polymorphic_tagger?
attr_accessible :tagger_type
belongs_to :tagger, :polymorphic => true
belongs_to :tagger, :polymorphic => true
else
belongs_to :tagger, case Tagtical.config.tagger
when Hash then Tagtical.config.tagger
when true then {:class_name => "User"} # default to using User class.
when String then {:class_name => Tagtical.config.tagger}
when Hash then
Tagtical.config.tagger
when true then
{:class_name => "User"} # default to using User class.
when String then
{:class_name => Tagtical.config.tagger}
end
end

before_create { |record| record.relevance ||= default_relevance }

class_attribute :default_relevance, :instance_writer => false
self.default_relevance = 1

Expand All @@ -45,7 +50,16 @@ def set_tag_target_with_relevance(tag)
end
set_tag_target_without_relevance(tag)
end

alias_method_chain :set_tag_target, :relevance

private

def validate_relevance
if range = Tagtical::Tag.relevance_range
errors[:relevance] = "must be between #{range.begin} and #{range.end}" unless range.include?(relevance)
end
end

end
end
17 changes: 15 additions & 2 deletions spec/tagtical/tagging_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@
context "when no relevance set" do
before do
@tagging.relevance = nil
@tagging.run_callbacks(:create)
@tagging.run_callbacks(:validation)
end
its(:relevance) { should == @klass.default_relevance }
end
context "when relevance set" do
before { @tagging.run_callbacks(:create) }
before { @tagging.run_callbacks(:validation) }
its(:relevance) { should == @tagging.relevance }
end
end
Expand Down Expand Up @@ -60,4 +60,17 @@
end
end

describe "relevance_range" do
before do
@taggable = TaggableModel.create(:name => "Bob Jones")
Tagtical::Tag.relevance_range = (0..10)
end

it "should throw an error if the relevance is out of range" do
@taggable.set_tag_list "car:11"

expect { @taggable.save }.to raise_error
end
end

end

0 comments on commit 98537d4

Please sign in to comment.