5

モデルのカテゴリと製品があります。使用するcategory.products << new_productと、アイテムが配列に追加され、レコードがデータベースに保存されます。次の「add」メソッドを配列クラスに追加しようとしましたが、new_product が配列に追加されますが、データベースには保存されません。何故ですか?

class Array
  def add(item)
    self << item
  end
end

アップデート:

collection_proxy.rb には次のメソッドがあります。

def <<(*records)
  proxy_association.concat(records) && self
end
alias_method :push, :<<

したがって、次の拡張機能が機能します。

class ActiveRecord::Relation
  def add(*records)
    proxy_association.concat(records) && self
  end
end

解決:

CollectionProxy にエイリアスを追加します。

class ActiveRecord::Associations::CollectionProxy
  alias_method :add, :<<
end
4

1 に答える 1

2

編集:マヌエルはより良い解決策を見つけました

class ActiveRecord::Associations::CollectionProxy
  alias_method :add, :<<
end

元のソリューション:

これで始められるはずです。完璧ではありません。

class ActiveRecord::Relation
  def add(attrs)
    create attrs
  end
end

モデル名を使用して新しい Rails プロジェクトを起動するのではなく、次の例に使用したものを使用しました。

1.9.3p194 :006 > Artist.create(:first_name => "Kyle", :last_name => "G", :email => "foo@bar.com")
 => #<Artist id: 5, first_name: "Kyle", last_name: "G", nickname: nil, email: "foo@bar.com", created_at: "2012-08-16 04:08:30", updated_at: "2012-08-16 04:08:30", profile_image_id: nil, active: true, bio: nil> 
1.9.3p194 :007 > Artist.first.posts.count
 => 0 
1.9.3p194 :008 > Artist.first.posts.add :title => "Foo", :body => "Bar"
 => #<Post id: 12, title: "Foo", body: "Bar", artist_id: 5, created_at: "2012-08-16 04:08:48", updated_at: "2012-08-16 04:08:48"> 
1.9.3p194 :009 > Artist.first.posts.count
 => 1 
于 2012-08-16T04:11:01.460 に答える