1

オブジェクトの属性を参照できるかどうか疑問に思っています。

オブジェクト User は attributefirst_nameを持っているので、通常、名の属性を更新したい場合は次のようにします:

user0 = User.new()
user0.update_attribute(:first_name, "joe")

今私の質問は、次の:first_nameように別の変数/シンボルを介して属性を更新できるかということです:

user0.update_attribute(:fname_ref, "jack")
user0.first_name  #=> has the value jack

Perl のように変数参照を探していましたが、Ruby では何も見つかりませんでした。

- - - - - 編集

私は lynda ruby​​ on rails チュートリアルを行っている最中であり、テーブル内のアイテムの位置を調整するモジュールを作成している最中です。残念ながら、最初に始めたとき、テーブルの列に別の名前を付けました pages.page_position, subjects.subject_position, sections.section_position

現在、モジュール PositionMover は 3 つのモデルで使用されるため、モデルごとに属性名が異なるため、問題が発生しています。

だから私はモデルごとにポインタ/参照を作成するだけで大​​丈夫だと思った

:position = :pages_position , :position = :subjects_position , :position = :section_position

したがって、それが可能かどうかという質問です。

それが不可能な場合は、どうすればよいか提案してください。モジュールは、異なる属性名を持つ3つの異なるモデルで使用できます。

申し訳ありませんが、私は初心者です。

4

4 に答える 4

2

シンボルは変数のようなものではなく、実際にはStringやFixnumのようなオブジェクト型であるため、symbol型の変数を持つことができます。

私はこれがあなたが探しているものだと思います:

attribute = :first_name
user0.update_attribute(attribute, "jack")
user0.first_name  #=> has the value jack

更新:文字列があり、記号に変換する必要がある場合(これが必要かどうかはわかりませんupdate_attribute

foo = "string"
foo.to_sym #=> :string
于 2012-05-16T01:54:23.727 に答える
1

alias_attributeを使用します。次のように各モデルに定義します。

ページ モデル

alias_attribute :position , :pages_position

対象モデル

alias_attribute :position , :subjects_position

断面モデル

alias_attribute :position , :section_position

そして、各モデルで (Model.position = values) を使用します。あなたの問題の解決策を願っています。

于 2012-05-16T05:52:30.907 に答える
0

send ドキュメントを使用し、シンボルまたは文字列を使用して属性のメソッドを参照することもできます。send実行時に呼び出すメソッドを選択できるため、非常に便利です。

例えば

user.first_name = "Jack" # set first_name to Jack
                         # Note: method "first_name=" (a settor) is being used    

attribute = "first_name"
user.send attribute + "=", "Jack" # set first_name to Jack
                                  # The string "first_name=" is coerced into
                                  # a symbol

attribute = :first_name
val = user.send attribute # => returns "Jack"
于 2012-05-16T02:10:16.107 に答える
0

githubupdate_attributeActiveRecord::Persistenceモジュールでの定義を参照してください。

def update_attribute(name, value)
  name = name.to_s
  verify_readonly_attribute(name)
  send("#{name}=", value)
  save(:validate => false)
end

これにより、モデルに次を追加してその動作を実現できると思います。

alias_method :fname_ref= :first_name=

@Andrew Marshallが尋ねたように、なぜそれをしたいのか知りたいです。

于 2012-05-16T04:19:34.240 に答える