2012-08-15 45 views
5

Tôi có Danh mục và Sản phẩm mô hình. Nếu tôi sử dụng category.products << new_product mục sẽ được thêm vào mảng và bản ghi được lưu vào cơ sở dữ liệu. Tôi đã thử thêm phương thức "add" sau vào lớp mảng và trong khi nó thêm new_product vào mảng, nó không lưu nó vào cơ sở dữ liệu. Tại sao vậy?Thêm phương thức Thêm vào mảng ActiveRecord

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

Cập nhật:

collection_proxy.rb có các phương pháp sau đây:

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

Vì vậy, các phần mở rộng sau hoạt động:

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

Giải pháp:

Thêm một bí danh cho CollectionProxy:

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

Bởi vì hiệp hội Rails không mảng, họ chỉ tuyên bố họ . –

+0

Vậy thì chúng là gì? làm cách nào tôi có thể thêm phương thức "Thêm"? – Manuel

Trả lời

2

Edit: Manuel tìm thấy một giải pháp tốt hơn

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

giải pháp gốc:

này sẽ giúp bạn bắt đầu. Nó không hoàn hảo.

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

Thay vì cháy lên một dự án đường ray mới với tên mô hình của bạn, tôi chỉ sử dụng một trong tôi đã cho ví dụ sau:

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

Cảm ơn. Bạn có biết tại sao nó thất bại khi bạn thêm bản ghi mới không phải là một băm nhưng đi qua một đối tượng? (Tôi nhận được "NoMethodError: undefined method' stringify_keys '") – Manuel

+0

@Manuel yes,' add' đang gọi 'create' và nó hy vọng các thuộc tính như một băm. Bạn có thể thay đổi phương thức thành một cái gì đó như 'create item.attributes' nhưng bạn có thể gặp một số vấn đề với các thuộc tính được bảo vệ. Cân nhắc chọn ra những thứ bạn cần từ đối tượng. – Kyle

+0

Không hoàn toàn: (tạo item.attributes tạo bản ghi trong cơ sở dữ liệu nhưng không tạo mối quan hệ (trong trường hợp artist_id của bạn là null) – Manuel

Các vấn đề liên quan