2017-05-22 3 views
0

私はルビーの協会を見ていて、構文上の観点から彼らがどう働いているのだろうと思っていました。見てhas_manyとは何か、それはどのように動作するのですか?

:「:マイルストーン」

class Project < ActiveRecord::Base 
    belongs_to    :portfolio 
    has_one     :project_manager 
    has_many    :milestones 
    has_and_belongs_to_many :categories 
end 

私の理解では、例えばにhas_manyは、パラメータで呼び出されるメソッドであるということです。しかし、これはどうやってできますか?どのようにクラス本体でメソッド呼び出しができますが、別のメソッドや関数の内部ではできませんか?

私が何を意味するかわからない場合は、しかし、うまくいけば誰かが私にそれを説明することができます。

答えて

1

Rubyのオブジェクトモデルは、古典的な言語とはまったく異なります。クラスは、石のタブレットに刻まれた青写真のようなものです。

Rubyクラスでは、変更可能なクラスオブジェクトです。これを置くもう1つの方法は、クラスは、それ自体のインスタンスを作成するファクトリとして機能する単なるオブジェクトです。

あなたはクラス定義にしたい任意のコードを実行することができます。上から下までそのevalutedよう

class World 
    puts "Hello #{name}" 
end 

を。

これは、metaprogrammingに対して広範囲に使用されます。たとえば、あなたはattr_accessorを使用してセッターとゲッターを宣言:ageage=方法を追加することにより、クラスを変更

class Person 
    attr_accessor :age 

    def initialize(age:) 
    @age = age 
    end 
end 

を。これは次のようになります。

class Person 

    def age 
    @age 
    end 

    def age=(value) 
    @age = value 
    end 

    def initialize(age:) 
    @age = age 
    end 
end 

レールアソシエーションは同じ方法で動作します。ちょっと複雑です。 belongs_to :portfolioは、セッターとゲッターを作成し、どのような関連付けが行われているかを把握しているreflection objectsを作成します。

+0

btw、それは 'attr_accessor'であり、' attribute_accessor'ではありません。 –

+0

ありがとう@SergioTulentsev – max

+0

ああ、他の出来事を逃した –

4

これはどのようにすることができますか?どのようにクラス本体でメソッド呼び出しができますが、別のメソッドや関数の内部ではできませんか?

クラス定義はほかのコードと同様です。クラスファイルがロードされると、そのボディは上から下に評価されます。これには、has_many(これは深さActiveRecord::Baseからのもの)などの呼び出しメソッドが含まれます。または他の方法。

class Foo 
    puts "Loading class #{name}" 
end 

# >> Loading class Foo 

このputsは単にクラスにファイルをロードすることによって実行されることに注意してください。あなたはf = Foo.newやそのようなものをする必要はありません。

関連する問題