44

既存のモデルに、永続化する必要のない、またはデータベース列にマップする必要のない属性を追加したいと思います。そのようなことを指定するための解決策はありますか?

4

5 に答える 5

55

もちろん、古き良きルビーを使用してattr_accessorください。モデル内:

attr_accessor :foo, :bar

次のことができるようになります。

object.foo = 'baz'
object.foo #=> 'baz'
于 2012-08-16T12:49:16.650 に答える
29

同じ問題が発生していましたが、モデルをブートストラップする必要があったため、to_jsonが呼び出された後も属性を保持する必要がありました。このためにもう1つ行う必要があります。

apneadivingで述べたように、開始する最も簡単な方法は、モデルに移動して次を追加することです。

attr_accessor :foo

次に、必要な属性を割り当てることができます。ただし、属性を固定するには、属性メソッドを変更する必要があります。モデルファイルに次のメソッドを追加します。

def attributes
  super.merge('foo' => self.foo)
end
于 2013-12-06T06:07:30.933 に答える
6

これをビューにレンダリングする方法がわからない場合は、次のように、renderメソッドのメソッド引数を使用してください。

render json: {results: results}, methods: [:my_attribute]

選択した回答で説明されているように、これはモデルにattr_accessorを設定し、コントローラーアクションで属性を設定した場合にのみ機能することを理解してください。

于 2016-01-20T16:53:59.280 に答える
4

Rails 5.0以降では、次のものを使用できますattribute

class StoreListing < ActiveRecord::Base
  attribute :non_persisted
  attribute :non_persisted_complex, :integer, default: -1
end

属性を使用attributeすると、永続化されているものと同じように作成されます。つまり、タイプやその他のオプションを定義したり、createメソッドで使用したりできます。

DBテーブルに一致する列が含まれている場合、既存の列のSQLとの間の変換にも影響を与えるため、DBテーブルは永続化されます。attribute

参照:https ://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html#method-i-attribute

于 2020-01-10T15:41:29.797 に答える
1

私の場合、左結合を使用してカスタム属性を設定したいと思いました。何も追加しなくても機能しますが、新しいオブジェクトに属性を設定できるようにしたいのですが、もちろん存在しません。追加すると、常に。の後にattr_accessor戻ります。これが私が最終的に得たアプローチであり、新しいオブジェクトを設定し、左結合から取得するために機能します。nilselect

after_initialize do
  self.foo = nil unless @attributes.key?("foo")
end

def foo
  @attributes["foo"]
end

def foo=(value)
  @attributes["foo"] = value
end
于 2014-10-28T13:01:09.890 に答える