2015-12-22 34 views
6

PHPでは、(データベースの列ではない)属性をモデルに設定できます。例えば(PHPコード)、`attr_accessor`のないrailsモデルの非データベース属性を設定する

$user = new User; 
$user.flag = true; 

しかし、私はデータベースに存在しない任意の属性を設定すると、レールに、それは誤りundefined method flagをスローします。 attr_accessorメソッドがありますが、約10個のtemp属性が必要な場合はどうなりますか?

+0

:DBからの属性と同じように

attr_accessorはちょうどあなたが、クラスが初期化されるときに相互作用&を呼び出すことができ、あなたのクラスでsetter & getter(インスタンス)メソッドのセットを作成しますオブジェクトの属性は、少なくとも私にとってはコードの匂いです。ここで何か関連があります:https://www.youtube.com/watch?v=SvL_aZt3zyU –

+1

通常、レールに$ -variablesを使用しません。そこにPHPとRubyのコードを混在させていますか? –

+0

@MaxWilliamsいいえ、これはPHPの例です。 – sawa

答えて

3

これは、ActiveRecordが設計どおりに動作するためです。任意の属性を設定する必要がある場合は、別の種類のオブジェクトを使用する必要があります。

たとえば、RubyにはOpenStructというライブラリがあり、任意のキー/値を割り当てることができるオブジェクトを作成できます。このようなライブラリを使用して、データベースに保存する必要がある場合にのみ、オブジェクトを対応するActiveRecordインスタンスに変換することができます。

ActiveRecordは、単にそのように動作するように設計されていないため、上記のように動作させないでください。現在のPHPの知識からはcargo cultingのエラーになります。

+0

ありがとうございます。あなたのソリューションを@Nimirソリューションと組み合わせて、それは完全に動作します:D 'attr_accessor:flag after_initialize do | user | self.flag = OpenStruct.new end' そして、私は '@user.flag.hello = "Hello World" の ' PS使って、一時フラグ属性を取得/設定することができます:SRを、私は方法がわかりませんコードをフォーマットする – user3783161

0

一時属性が必要な場合は、それらをシングルトンオブジェクトに追加できます。

model = Model.new 

class << model 
    attr_accessor :name 
end 
1

すべてのことattr_accessorは、インスタンス変数を使用しgetterメソッドとsetterメソッドを追加されないなど、これらのメソッドを追加します。この

attr_accessor :flag 

:あなたはこれらのメソッドを自分で書くことができ

def flag 
    @flag 
end 

def flag=(val) 
    @flag = val 
end 

を必要ならばインスタンスvarに値を格納するよりも面白い何かをすることができます。

2

男が説明したように、attr_accessorはただちにsettergetterです。

レコードの初期化時にモデルattr_accessorをRuby#Hash(例:ActiveRecord#After_initilize method)に設定すると、一時的に値(idea credit to this answer)を保存する柔軟性が増します。以下のような

何か:

class User < ActiveRecord::Base 

    attr_accessor :vars 

    after_initialize do |user| 
    self.vars = Hash.new 
    end 

end 

は今、あなたは何ができる:

user = User.new 

#set 
user.vars['flag'] = true 

#get 
user.vars['flag'] 
#> true 
5

が、私は約十一時属性が必要な場合、何が起こるのだろうか?

#app/models/user.rb 
class User < ActiveRecord::Base 
    attr_accessor :flag, :other_attribute, :other_attribute2, :etc... 
end 

attr_accessorレールに"virtual" attributesを作成する - 彼らはデータベースに存在しますが、モデル内に存在しているしていません。

以外の列を持つ
#app/models/user.rb 
class User < ActiveRecord::Base 
    attr_accessor :flag 

    # getter 
    def flag 
    @flag 
    end 

    # setter 
    def flag=(val) 
    @flag = val 
    end 
end 
関連する問題