Ruby on Rails ActiverCordモデルアクセサーズの理解
-
22-09-2019 - |
質問
私のモデル「DataFile」には、モデルの外部から設定したいフィールドがたくさんあります。
file = DataFile.new file.owner = 123
今、私の知る限り、私はモデルに「attr_accessor:field」を、外部から変更したいすべてのフィールドに配置する必要があります。ただし、上記のコードは、attr_accessorsが定義されていないため、所有者フィールドを123に設定することなく正常に実行されます。なぜそれがなぜですか?
「定義されていないメソッド」エラーなどを取得することを期待していました。
解決
Rails 'ORMはActiverCordパターンを使用するため、そのテーブルに関連付けられたデータベースの各列に対して2つの方法が自動的に作成されます。 列名, 、 と columnName =. 。これは、ActiverCord :: Baseからモデルが継承した結果として「自動的に」発生します。これらの方法は、Rubyのメタプログラム機能を使用して定義され、クラスの作成時に動的に作成されます。
何が起こっているのかについての詳細については、Railsのソースを見てみましょう。ただし、上記はおそらく何が起こっているのかを理解するのに十分です。
他のヒント
ドリューとゼップロックはそれを正しくしましたが、もう1つ追加します。 Rails(実際、ActivereCord)がデータベースフィールド用に作成するアクセサはRubyアクセサではありません。スクリプト/コンソールを使用すると、所有者がオブジェクトファイルのインスタンス変数ではないことがわかります。
標準のアクセサから離れて、ファイル上のメソッド内で@Ownerを操作しようとするまで、これに気付かないでしょう。 RubyがRailsを学んでいると同時に学んでいる場合(これは私がしたことです)、ある時点でこれにぶつかる可能性があります。これがあなたが書く必要がある理由です:
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
おそらく「所有者」はデータベースモデルの一部です。データベースフィールドのアクセサーは、自動生成されています。