2011-02-22 13 views
2

私はRailsアプリケーションに2つのクラスがあるとします。拡張Active Recordは、冗長性を減らすために

class Subject < ActiveRecord::Base 
    def children? 
    Subject.where(:parent_id => self.id).length > 0 
    end 

def children 
    Subject.where(:parent_id => self.id) 
end 
end 


class Region < ActiveRecord::Base 
    def children? 
    Region.where(:parent_id => self.id).length > 0 
    end 

def children 
    Region.where(:parent_id => self.id) 
end 
end 

はどのような冗長なクラスメソッドを軽減するための最良の方法だろうか?私は2つの新しいメソッドでActiveRecordを拡張できますか?もしそうなら、どのようにして2つの新しいメソッドを両方のクラスで利用できるように書くことができますか?

おかげで、 マイク

答えて

2

実際に対処しているのはhas_manyの関連付けです。

DRY原則は非常に良いですが、この場合ではありません。あなたは、メインの画像を複雑にする一方、モデルから非常にシンプルでネイティブなものを抽出したい。

だから、あなただけのだけのルビースタイルに

class Subject < ActiveRecord::Base 
    has_many :children, :class_name => "Subject", :foreign_key => :parent_id 

    def children? 
    children.present? 
    end 
end 
1

は、それが何を見るか、同じタスクを実行しようとしているように見えるとして、それを使用するためにacts_as_treeを見てください。

1

あなたはクイックフィックス小さなオブジェクトを扱っている場合は、アプリケーションのヘルパー・ファイル内の2つの汎用メソッドを作成することです:

def children?(myObject) 
    myObject.where(:parent_id => myObject.id).length > 0 
end 
def children(myObject) 
    myObject.where(:parent_id => myObject.id) 
end 

編集:あなたはActiveRecordの方法を定義することができ、集中何も複数のリソースのため ::彼らはそれから両方を継承しているのでベース。

def children? 
    self.where(:parent_id => self.id).length > 0 
end 
def children 
    self.where(:parent_id => self.id) 
end 
1

私はacts_as_treeの使用に関する@ abdollarの提案に同意します。あるいは、同じテーブルにアソシエーションを作成することもできます(これはacts_as_treeの機能です)。

あなたが例として挙げられてきたこれらのメソッドを使用して独自のロールしたい場合は、あなたが必要とし、あなたのモデルに含めることができますlibにモジュールを作成することができます...

# lib/children.rb 
module Children 
    def children 
    self.class.where(:parent_id => self.id) 
    end 

    def children? 
    children.present? 
    end 
end 

# app/models/subject.rb (or any other model) 
require 'children' 
class Subject < ActiveRecord::Base 
    include Children 
end 

あなたが」レール2を使用している場合、libが自動ロードされているので、require 'children'を実行する必要はありません。レール3を使用している場合は、それをイニシャライザなどに入れてクリーンアップすることができます。

+0

少しをリファクタリングすることができます 'children.size> 0 '=>' children.empty?' :) – fl00r

+0

ええ、それは立派だ...良い点。私はあなたが '!children.empty?'を意味すると思っています、あるいはさらにもっと慣用的です。 'children.present? ' – idlefingers

+0

+1の' present? ':D – fl00r

関連する問題