4

次のような RoR モデル person.rb があるとします。

class Person < ActiveRecord::Base
  attr_accessible :first_name, :last_name

  validates :first_name, presence: true
  validates :last_name, presence: true
end

私は以下のいずれかを行うことができないようです:

@full_name = @first_name + " " + @last_name

また

def full_name
   @first_name + " " + @last_name 
end

私の理解では、どちらも通常の Ruby クラスで動作するはずです。

私は少し読んだのですが、以下が進むべき道のようです:

def full_name
    self.first_name + " " + self.last_name
end

私はこれを機能させることができますが、インスタンス変数を何らかの方法で参照できない (または新しい変数を作成できない) ように見える理由を本当に理解したいと思います。

ActiveRecord::Base はインスタンス変数に対して非常に面白いことをしますか? モデル (この場合は Person クラス) を、DB 内の単なるラッパーにすぎないように制限しますか?

attr_accessor も定義できないようです... しかし、first_name と last_name をうまく設定できます (一括代入だけでなく、p = Person.new; p.first_name = foo)

誰かがこれに光を当てることができれば、それは大歓迎です.

どうもありがとう、

4

2 に答える 2

10

@attributesActiveRecord モデルの属性は、ハッシュであるというインスタンス変数に格納されます。この変数にアクセスするためのゲッターとセッターが定義されています。

ところで、これは Ruby で文字列を連結するための推奨される方法です。

"#{first_name} #{last_name}"

この方法で文字列に直接挿入できる組み込みの "to_s" メソッド (ほとんどのオブジェクトに) があります。これを行うことはできませんでしたが"string " + 1、エラーを発生させることなく、これを行うことができます:"string #{1}"

于 2012-10-16T22:00:52.150 に答える
5

Active Record は、個々のインスタンス変数にデータベース属性を保存しません。これが、Active Record が提供するアクセサーを使用する必要があり、によって生成されたアクセサーが機能しない理由attr_accessorです。

代わりに、Active Record は (型キャストの前後に) 属性をハッシュに格納しますが、これは実装の詳細であり、気にする必要はありません。

于 2012-10-16T21:58:16.820 に答える