2

私のモデル「DataFile」には、モデルの外部から設定したいフィールドがたくさんあります。

file = DataFile.new
file.owner = 123

さて、私が知る限り、外部から変更したいすべてのフィールドについて、モデルに「attr_accessor:field」を配置する必要があります。ただし、上記のコードは、attr_accessorsを定義せずに正常に実行され、所有者フィールドが123に設定されます。これはなぜですか。

「メソッドが定義されていません」というエラーなどが発生することが予想されました。

4

3 に答える 3

11

RailsのORMはActiveRecordパターンを使用するため、そのテーブルに関連付けられたデータベースの列ごとに、columnnameとcolumnname=の2つのメソッドが自動的に作成ます。これは、モデルがActiveRecord::Baseから継承した結果として「自動的に」発生します。これらのメソッドは、rubyのメタプログラミング機能を使用して定義され、クラスの作成時に動的に作成されます。

何が起こっているのかについての詳細は、Railsのソースを参照してください。ただし、上記はおそらく、何が起こっているのかを実際に理解するのに十分です。

于 2009-10-19T13:57:58.753 に答える
1

DrewとZepplockはそれを正しく理解しましたが、もう1つ追加します。Rails(実際にはActiveRecord)がデータベースフィールド用に作成するアクセサーはRubyアクセサーではなく、スクリプト/コンソールを使用すると、所有者がオブジェクトファイルのインスタンス変数ではないことがわかります。

標準のアクセサーから離れて、ファイル上のメソッド内で@ownerを操作しようとするまで、これに気付かない可能性があります。Railsを学習しているのと同時にRubyを学習している場合(これは私が行ったことです)、ある時点でこれに遭遇する可能性があります。これがあなたが書く必要がある理由です:

class MyClass < ActiveRecord::Base
  def invalidate_owner
    self.owner = owner << " no longer owns this"
    save
  end
end

それ以外の

class MyClass < ActiveRecord::Base
  def invalidate_owner
    self.owner << " no longer owns this"
    save
  end
end
于 2009-10-19T16:38:41.893 に答える
0

ほとんどの場合、「所有者」はデータベースモデルの一部です。データベースフィールドのアクセサは自動生成されます。

于 2009-10-19T13:58:10.737 に答える