module ActiveContent::Taxonomizable

Public Instance Methods

has_taxonomized(name, options={}) click to toggle source
# File lib/active_content/taxonomizable.rb, line 40
def has_taxonomized(name, options={})
  assoc_name  = "#{name}".pluralize
  assoc_field = options[:through] || self.name.parameterize.underscore.pluralize
  assoc_class = (options[:class_name] || "#{name}".classify).constantize.base_class
  assoc_table = assoc_class.table_name
  assoc_type  = assoc_class.name
  assoc_proc  = -> { where taxonomizations: { field: assoc_field } }

  has_many :"#{assoc_name}", assoc_proc, through: :taxonomizations, source: :taxonomizable, source_type: "#{assoc_type}"

  scope :"with_#{assoc_name}", -> (*ids) do
    params = ids.flatten
    query  = joins(:"#{assoc_name}")
    query  = query.where(assoc_table => { id: params }) if params.any?

    query.distinct(true)
  end

  scope :"without_#{assoc_name}", -> (*ids) do
    joins(:"#{assoc_name}").where.not(assoc_table => { id: ids }).distinct(true)
  end
end
has_taxonomy(name, options={}) click to toggle source
# File lib/active_content/taxonomizable.rb, line 6
def has_taxonomy(name, options={})
  options = options.reverse_merge(class_name: "#{name}".classify, source: :taxonomy)
  options = options.merge(through: :"#{name}_taxonomizations")
  setting = { as: :taxonomizable, class_name: ActiveContent.config.taxonomization_class_name, autosave: true, dependent: :destroy }

  has_many options[:through], -> { where field: "#{name}".downcase }, setting
  has_many name, options

  define_method :"#{name}_list" do
    self.send(name).pluck(:name)
  end

  define_method :"#{name}_list=" do |*names|
    model = options[:class_name].classify.constantize
    items = names.flatten.reject(&:blank?).map do |n|
      model.find_by_name(n) || model.new(name: n)
    end

    self.send :"#{name}=", items
  end

  scope :"with_#{name}", -> (*ids) do
    params = ids.flatten
    query  = joins(:"#{name}")
    query  = query.where(taxonomies: { id: params }) if params.any?

    query.distinct(true)
  end

  scope :"without_#{name}", -> (*ids) do
    joins(:"#{name}").where.not(taxonomies: { id: ids }).distinct(true)
  end
end