2010-01-19 35 views
7

Trước khi tôi đăng điều này như là một lỗi cho đội đường ray, tôi muốn xem nếu tôi đang làm điều gì đó sai có thể gây ra hành vi này. Cụ thể, thuộc tính: autosave của các liên kết has_many dường như không hoạt động theo tài liệu.: thuộc tính tự động của các liên kết has_many bị hỏng trong Rails 2.3.4?

Để tham khảo, đây là tài liệu API mới nhất: http://api.rubyonrails.org/classes/Acti ... ation.html

Hãy xem phần "One-to-many Ví dụ". Tôi đã sao chép mã ở đó chính xác trong một ứng dụng thử nghiệm, và nó không làm việc cho tôi. Cụ thể, đối tượng cha được cập nhật, nhưng đối tượng con thì không.

schema của tôi là như sau:

create_table :posts do |t| 
    t.string :title 

    t.timestamps 
end 

create_table :comments do |t| 
    t.text :body 
    t.integer :post_id 

    t.timestamps 

Mô hình của tôi như sau:

class Post < ActiveRecord::Base 
    has_many :comments, :autosave => true 
    end 

    class Comment < ActiveRecord::Base 
    belongs_to :post 
    end 

Trong giao diện điều khiển, tôi chạy các lệnh sau (các đối tượng bài và nhận xét là đã có trong DB tại thời điểm này):

post = Post.find(1) 
    post.title # => "The current global position of migrating ducks" 
    post.comments.first.body # => "Wow, awesome info thanks!" 
    post.comments.last.body # => "Actually, your article should be named differently." 

    post.title = "On the migration of ducks" 

    post.comments.last.body = "Actually, your article should be named differently. [UPDATED]: You are right, thanks." 

    post.save 
    post.reload 

Nhưng đây là những gì tôi nhận được cho đầu ra:

post.title # => "On the migration of ducks" 
    post.comments.last.body # => "Actually, your article should be named differently." 

Hơn nữa, nhìn vào các bản ghi này là báo cáo cập nhật duy nhất tôi nhìn thấy:

Post Update (0.6ms) UPDATE "bài viết" SET "updated_at" = '2010/01/18 23:32: 39 ', "title" =' Khi di chuyển các con vịt 'WHERE "id" = 1

Vì vậy, có vẻ như việc lưu không đổ xuống đối tượng nhận xét, điều này dường như bị phá vỡ rõ ràng với tôi. Tôi đã thử điều này trên hai hệ thống khác nhau chạy 2.3.4 và hành vi có thể lặp lại.

Đây là phần lạ, mặc dù: Nếu tôi lần đầu tiên gọi "post.comments" trước khi tôi cố gắng đặt giá trị, nó hoạt động tốt! Để được chính xác:

post.title = "On the migration of ducks" 

    post.comments #Note that this line was not called above 
    post.comments.last.body = "Actually, your article should be named differently. [UPDATED]: You are right, thanks." 

    post.save 
    post.reload 

Bây giờ đầu ra mang lại cho tôi những kết quả chính xác:

post.title # => "On the migration of ducks" 
    post.comments.last.body # => "Actually, your article should be named differently. [UPDATED]: You are right, thanks." 

Và các bản ghi chứa các bản cập nhật chính xác:

Comment Cập nhật (0.3ms) UPDATE "ý kiến" SET "updated_at" = '2010-01-18 23:44:43', "body" = 'Trên thực tế, bài viết của bạn nên được đặt tên khác. [CẬP NHẬT]: Bạn nói đúng, cảm ơn. ' WHERE "id" = 2

Vì vậy, điều này thực sự có vẻ bị phá vỡ đối với tôi. Tôi đoán rằng đó là vấn đề với cách tham chiếu đối tượng được xử lý, tức là khi đối tượng là một phần của bộ sưu tập được phân bổ, nó sẽ tiết kiệm tiền nhưng không lưu khi được kéo dưới dạng một đối tượng duy nhất từ ​​cơ sở dữ liệu. Nhưng trước khi tôi gửi điều này cho nhóm Rails như một lỗi tôi muốn xem liệu có ai khác đã gặp phải vấn đề này hay không, hoặc nếu tôi chỉ làm một cái gì đó hoàn toàn đẫm máu mà tôi không thấy bởi vì tôi đã dành cả ngày .

+0

Tôi không nghĩ rằng bạn có thể gửi một lỗi cho Rails 2.3.4, vì đó không phải là bản phát hành ổn định cuối cùng của chuỗi 2.3. Có thể có một lỗi đã được sửa trong mô-đun AutosaveAssociation. Tôi thậm chí sẽ nghi ngờ rằng họ sẽ làm cho một bugfix này trong 2.3.11. –

Trả lời

0

Đây là quá phổ biến như được mong đợi, và các công trình xung quanh là đủ đơn giản:

last_comment = post.comments.last 
last_comment.body = "[totally awesome dream hands]" 
last_comment.save 

Không rất gọn gàng, nhưng chức năng :)

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