Railsベストプラクティス--Models
1687 ワード
1.Modelsは忙しい
方法:
コードをできるだけモデルに入れます.
理由:
1. 下位層ほど多重化しやすい.
2. Modelは機能クラスで、より早くテストできます.コントロールラーのようなビジネスクラスは、城を攻めるライオンたちが「私のコードが書けた」と発表するまで、本当のテストを開始することはできません.
3. RailsフレームワークではModelが強く、Controllerは薄く見えます.
適用バージョン:
all
2.クエリー文をscopeに書く
コードの速さ:
次の操作を行います.
3.ネスト属性Nested attributesの使用
@user.を使用できる場合account_settingのような属性がModelに対応する関係Modelを取得する場合、私たちは「一気に」なる機会があります.次のように:
4.高速migration:
参照先:
http://cn.asciicasts.com/episodes/215-advanced-queries-in-rails-3
http://railscasts.com/episodes/108-named-scope Rails2.1
http://pivotallabs.com/users/nick/blog/articles/284-hasfinder-it-s-now-easier-than-ever-to-create-complex-re-usable-sql-queries以前のバージョンを使用する場合はhas_が必要ですfinder
方法:
コードをできるだけモデルに入れます.
理由:
1. 下位層ほど多重化しやすい.
2. Modelは機能クラスで、より早くテストできます.コントロールラーのようなビジネスクラスは、城を攻めるライオンたちが「私のコードが書けた」と発表するまで、本当のテストを開始することはできません.
3. RailsフレームワークではModelが強く、Controllerは薄く見えます.
適用バージョン:
all
2.クエリー文をscopeに書く
コードの速さ:
class Product < ActiveRecord::Base
belongs_to :category
named_scope :cheap, :conditions => { :price => 0..5 }
named_scope :recent, lambda { |*args| {:conditions => ["released_at > ?", (args.first || 2.weeks.ago)]} }
named_scope :visible, :include => :category, :conditions => { 'categories.hidden' => false }
end
次の操作を行います.
3.ネスト属性Nested attributesの使用
@user.を使用できる場合account_settingのような属性がModelに対応する関係Modelを取得する場合、私たちは「一気に」なる機会があります.次のように:
# controller , : AccountSetting.new
def new
@user = User.new (:account_setting => AccountSetting.new)
end
def create
@user = User.new(params[:user])
@user.save
end
# Model
has_one :account_setting, :dependent => :destroy
accepts_nested_attributes_for :account_setting
# views
<%= form_for(@user) do |f| %>
...
<%= f. fields_for :account_setting do |a| %>
4.高速migration:
script/generate migration AddRoleToUser role:string
参照先:
http://cn.asciicasts.com/episodes/215-advanced-queries-in-rails-3
http://railscasts.com/episodes/108-named-scope Rails2.1
http://pivotallabs.com/users/nick/blog/articles/284-hasfinder-it-s-now-easier-than-ever-to-create-complex-re-usable-sql-queries以前のバージョンを使用する場合はhas_が必要ですfinder