2009-05-22 13 views
2

Googleには、一般的なソーシャルコンテンツ(ブログ/フォーラム/ストリームなど)を扱うウェブアプリがあります。Railsのデザイン/コーディング

すべてのコンテンツに任意で都市が設定されています。私。ブログ投稿がニューヨーク特有のものであれば、そのようにマークされます。

ユーザーは、市街の表示設定を設定してすべてのものを他のユーザーに表示している場合は、サイト固有の情報(サイト全体)を表示するだけです。

city_specifc_viewの場合、 'とcity == current_city'を追加する必要がありますか?メンテナンスのナイトメアであるすべてのモデルクラスのすべての私のファインダーに(特にこのロジックが変わるリスクがあるので)。

このロジックを適用する正しい方法は何か不思議です。モデル全体に​​if/elseの代わりに中央の場所(デフォルトのfindを上書きするなど)を行うことはできますか? ActiveRecordにオプションでパッチを当てているのですか?

答えて

2

ActiveRecord :: Baseには、スコープと呼ばれる機能があります。特定のスコープで発行されたクエリは、このスコープの検索オプションと組み合わせられます:

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

おそらくこれは調べたい機能ですか?

1

変更AR.findはあなたのための最良の選択ですが、それは私のために働いているかどうかを知るしないでください:これはあなた

+0

おかげフェルを助けるかもしれない

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 

ホープ。あなたのソリューションはいいです。フィルタにクエリを追加することによって、DBからフィルタリングされたデータをまったく持ち込まないようにすることができたら、私は考えていました。私はwith_scopeを使ってARにパッチを当てることにより、ファインダーのために管理しました。しかし、関連に対して生成されたクエリにはまだ取り組んでいません。 –

+0

関連性のある関連クエリは含まれていませんが、落とし穴があります。DBがローカルの場合、小さな(インデックス付き)クエリは1つより大きい場合があります(結合されている場合)。あなたのデータベースより良い。希望はあなたを助けますが、いつものように:選択する前にあなたのソリューションを評価してください! – Oinak