2

Containerという名前の列を持つRailsモデルがありますproducts。これは、Postgres および「postgres_ext」gem でサポートされている文字列配列です。

GEMFILE の関連部分は次のとおりです。

gem 'rails', '3.2.9'
gem 'pg'
gem 'postgres_ext'
gem 'activerecord-postgres-hstore', git: 'git://github.com/engageis/activerecord-postgres-hstore.git'

移行の関連部分は次のとおりです。

 t.string :products, array: true

Containerこの配列に製品を追加するモデルでパブリック メソッドを作成しています。メソッドは次のようになります。

 attr_accessible :products

 def add_to_products(product)

  if products.blank? || products.size == 0 ## product array is either uninstantiated or blank
    products = [product.id]
  else  

    unless products.include? product.id
      products << product.id
    end
  end
end

irb/console での結果は次のとおりです。

pry(main)> c = Container.first
=> #<Container id: "2765cc19-98f8-4e42-a1be-538788424ec7", name:....
pry(main)> p = Product.first
=> #<Product id: "319a25ae-87fe-4769-a9de-1a8e0db9e84f", name: ....
pry(main)> c.add_to_products(product)
pry(main)> c.products
=> nil
pry(main)> c.products= [] << "319a25ae-87fe-4769-a9de-1a8e0db9e84f"
pry(main)> c.products
=> ["319a25ae-87fe-4769-a9de-1a8e0db9e84f"]

add_to_productsメソッドの何が問題なのか頭を悩ませています。誰かがこの奇妙な状況に光を当てることができますか? このメソッドを介して値を渡すと、値が設定されないのはなぜですか?

4

2 に答える 2

5

この問題は、実際には の使用に起因しています<<。Rails は、属性の変更をその場で追跡しません (この問題を参照してください)。Railsはこの変更を認識しないため、実際にはデフォルト値で問題が発生するため、配列を使用するときに演算子を避けたいことを使用上の注意で概説します。<<

products_changed?これは、状態を確認することでもわかります。を使用すると false になります<<

于 2013-02-04T15:23:30.143 に答える
2

これは、Ruby では、レシーバーを明示的に指定しない限り、割り当てによってローカル変数が作成されるという事実に関係していますself。この場合はそうです。そう:

products = [product.id]

...という名前のローカル変数を作成しますproducts。一方:

self.products = [product.id]

...それはあなたが本当に探しているものです。

于 2013-01-01T12:28:41.827 に答える