2012-05-02 8 views
4

MVCを理解すると、SQL(または永続性に関連する)クエリはModel/Controllerオブジェクトでのみ実行する必要があります。したがって、Rails 3 documentation about Controllersは次のように述べています。Rails 3のビューではクエリが受け入れられますか?

[コントローラ]モデルデータをビューで使用できるようにして、そのデータをユーザーに表示できるようにします。

しかし、ドキュメントもqueries directly in View (HTML helper) codeの使用例があります。

のRails 3では
select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }) 
# Note the model query -----^ 

、ビューでクエリを実行することが一般的に許容可能であるか、厳密にモデルにこのようなクエリを委任するために説得力のある理由がありますまたはコントローラオブジェクト?ドキュメンテーションは単なる実証的なものか、それともベストプラクティスの実例ですか?

答えて

6

私はそれは単なるデモンストレーションだと思うし、一般的に従うのは良い例ではない。これは、PHPで見つけることができるSQL Spaghettisコードには十分に近いです。

私は現時点でRails anti-patterns bookを読んでおり、モデル内のすべてのクエリを対象とすることを推奨しています。コントローラは、モデルに定義されたメソッドにアクセスして、結果をビューに表示します。

しかし、注意を払わないと、自分が太ったモデルを見つけて、そのようなパターンの大きな助けとなるNamed scopesを使うことができないようにすることができます。注目すべきもう1つの重要なルールは、Railsに適用されたLaw of Demeterで、あるモデルが他のモデルの実装の詳細をあまり知ってはならないことを意味します。したがって、関連するモデルに関連するクエリがある場合、この関連モデルでスコープを設定する必要があります。

最後に、以下のarticleスキンコントローラ、脂肪モデル)は、対象読者の方に適しています。

0

ビューが実際には単純であっても、ビューでクエリを実行することは一般的には受け入れられません。コントローラーが重くなるのを避けるために、良い習慣(ドキュメンテーションによれば)はヘルパーを作成してそこにクエリーを置くことです。

もちろん、クエリを再利用するには、スコープを使用してモデルに入れる方がよいでしょう。

+1

ビューでは主に(排他的に?)ヘルパーは使用されていませんか?ヘルパーにクエリを置くと、ビューでクエリを実行するのと同じではありませんか? – maerics

+0

私の見解は、それを直接ビューに置き、ドキュメントを正当化することを避けました。私は単純なデータを、多くの場合単一のテーブルから抽出するために使用します。アイテムのリストを含むコンボボックスを作成するヘルパーです。 –

関連する問題