Skip to content

Instantly share code, notes, and snippets.

@gruntruk
Created October 26, 2012 19:56
Show Gist options
  • Save gruntruk/3961085 to your computer and use it in GitHub Desktop.
Save gruntruk/3961085 to your computer and use it in GitHub Desktop.
class WallModuleQuery
def initialize(parent, relation = WallModule.scoped)
valid_parents = [Client, BrandTemplate, Store]
raise ArgumentError unless valid_parents.any? { |p|
parent.is_a?(p)
}
@parent = parent
@relation = relation
@draft = true
@states = ['published', 'enabled']
@order_fields = ['size', 'sector', 'position']
@datetime = nil
end
def with_state(state)
@relation = @relation.where(:state => valid_states_for(state.to_sym)
self
end
def datetime(*arg)
# TODO: add criteria to relation
self
end
def draft(value)
# TODO: add criteria to relation
self
end
def visible
@relation = @relation.where('visible_at <= ? AND visible_until >= ?',
@datetime, @datetime)
self
end
def find_each(options={}, datetime=nil, &block)
@relation = @relation.list_wall_modules.with_states.visible
if @draft
@relation = @relation.draft_ordered_by
else
@relation = @relation.ordered_by
end
@relation.find_each(&block)
end
private
def valid_states_for(option)
case option
when :all
['published', 'enabled', 'pending', 'disabled', 'hidden']
when :published_only
['published', 'pending']
when :disabled
['disabled', 'pending']
when :enabled
['enabled']
when :hidden
['hidden']
when :pending
['pending']
else # draft_mode
['published', 'enabled']
end
end
def list_wall_modules
@relation = @relation.where(:parent_type => @parent.class.name,
:parent_id => @parent.id)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment