vivekamn
vivekamn

Reputation:

Rails design/coding

We have a web app which serves typical social content(blogs/forums/streams etc).

All the content is optionally marked with a city. I.e. if a blog post is specific to New York, it will be marked so.

The task is to show only city specific information(all over the site) if user has set city view preference and show everything to all others.

So I have to add 'and city == current_city' if city_specifc_view? to all my finders in all my model classes, which is a maintenance night mare(especially as there is a risk of this logic changing).

I am wondering what is the right way to apply this logic. Can I do it a central place(like overrinding the default find), instead of if/else all over the models. Is monkey patching ActiveRecord an option?

Upvotes: 2

Views: 99

Answers (2)

Oinak
Oinak

Reputation: 1805

Don't know if modifying AR.find is the best choice for you but it worked for me:

class Content < AR::base
  def self.find(*args)
    if logged_user.preferred_city
      choose_city(super(*args))
    else
      super(*args)
    end
  end
protected #to be inherited by content subtypes (post, pic, stream...)
  def self.choose_city(target) 
    case target
      when Array target.select{|t| choose_city(t)}
      when Person (target.city == logged_user.preferred_city ? target : nil)
      else target
    end
  end
end

Hope this may help you

Upvotes: 1

flitzwald
flitzwald

Reputation: 20240

In ActiveRecord::Base there is a feature called scopes. A query being issued in a certain scope will be combined with this scope's find-options ie.:

  class Person < ActiveRecord::Base
    default_scope :order => 'last_name, first_name'
  end

Maybe this is a feature you want to look into?

Upvotes: 2

Related Questions