2

Dave Thomas の本、 「Agile Web Development with Rails」、第 4 版を読んでいました。Cartという名前のクラス内で、彼は、クラスCartLineItemの間の関係によって提供される「line_items」という名前の属性を呼び出しました。

Cartクラスでこの属性を使用するメソッド内では、インスタンスの属性を呼び出すときに使用される「@」なしで属性が呼び出されます。誰かが私になぜこれがうまくいくのか教えてもらえますか? 彼が「@」記号を使っていると思っていたからです。コードを以下に示します。

class Cart < ActiveRecord::Base
 has_many :line_items, :dependent => :destroy
 def add_product(product_id)
 #In this line below, I was expecting @lineitems.find_by ..... 
  current_item = line_items.find_by_product_id(product_id)
  if current_item
   current_item.quantity += 1
  else
   current_item = line_items.build(:product_id => product_id)
  end
  current_item
 end 
end
4

1 に答える 1

4

これが機能has_manyするのは、-のリーダーとライターのメソッドを作成するためです。これは、を使用してその属性名のリーダーとライターのメソッドを作成line_itemsするのと同じ方法です。attr_accessorこれは次のように非常に似ています。

class Cart
  def line_items
    @line_items
  end

  def line_items=(value)
    @line_items = value
  end
end

Railsは、使用しているモデルのデータベースの各列用のメソッドや、すべての関連付け(ここなど)用のメソッドなど、このようなメソッドを多数作成しますline_items

特定のアソシエーションに追加されるメソッドの詳細については、Railsガイドの「アクティブレコードアソシエーションのガイド」の第4章を参照してください。

于 2012-11-30T02:49:00.253 に答える