2012-08-15 13 views
5

Model Kategori ve Ürünlerim var. category.products << new_product kullanırsam, öğe diziye eklenir ve kayıt veritabanına kaydedilir. Dizi sınıfına aşağıdaki "ekleme" yöntemini eklemeyi denedim ve yeni_product diziye eklerken veritabanına kaydetmiyor. Neden?ActiveRecord dizisine Add yöntemi ekleme

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

Güncelleme:

collection_proxy.rb aşağıdaki yöntem etti:

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

Yani şu uzantısı çalışır:

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

Çözüm: CollectionProxy için bir takma ad ekleyin:

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

Raylar dernekler diziler olmadığından, onlar sadece onlar iddia: Aşağıdaki örnek vardı

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

modeliniz adlarını yeni raylar projeyi yangın yerine, ben sadece kullanılan bir . –

+0

Onlar ne? Bir "Add" yöntemini nasıl ekleyebilirim? – Manuel

cevap

2

Düzenleme:

Bu sizin başlamış: Manuel

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

Orijinal çözüm daha iyi bir çözüm buldu. Mükemmel değil.

1.9.3p194 :006 > Artist.create(:first_name => "Kyle", :last_name => "G", :email => "[email protected]") 
=> #<Artist id: 5, first_name: "Kyle", last_name: "G", nickname: nil, email: "[email protected]", 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 
+0

Teşekkürler. Yeni kaydı karma olarak değil, bir nesneyi geçirdiğinizde neden başarısız olduğunu biliyor musunuz? ("NoMethodError: undefined method" stringify_keys '") alıyorum – Manuel

+0

@Manuel evet,' add '' create' çağırıyor ve nitelikleri bir hash olarak bekliyor. Bu yöntemi item.attributes öğesi gibi bir şeye dönüştürebilirsiniz, ancak korunan özniteliklerle ilgili bazı problemler alabilirsiniz. Nesneden ihtiyacınız olanları seçmeyi düşünün. – Kyle

+0

Oldukça :(item.attributes veritabanında kayıt oluşturur, ancak ilişkiyi yapmaz (örneğiniz artist_id is null). – Manuel