2012-07-06 25 views
5

Hành vi mặc định cho Ruby on Rails là lưu các thay đổi được thực hiện cho các liên kết thu thập. Có cách nào để thay đổi hành vi này, để tôi có thể sửa đổi các bộ sưu tập trong bộ nhớ mà không có thay đổi được ghi vào cơ sở dữ liệu.Tắt tính năng lưu tự động qua liên kết has_many - Ngắt kết nối đối tượng ActiveRecord khỏi phiên

Vì vậy, nếu tôi có hai lớp:

class Project < ActiveRecord::Base 
    has_many :tasks 

class Task < ActiveRecord::Base 
    belongs_to :project 

và viết một số mã như:

Project.tasks.clear 
Project.tasks << task1 
Project.tasks << task2 

sau đó nó tự động xóa tất cả các nhiệm vụ liên quan đến dự án và tự động ghi các thay đổi đối với db.

Đây là ví dụ về những gì tôi đang cố gắng đạt được. Tôi biết tôi có thể sử dụng Project.tasks.build() để thêm một nhiệm vụ mới vào bộ sưu tập mà không có nó được lưu tự động, nhưng các nhiệm vụ mà tôi đang thêm không phải là nhiệm vụ mới. Họ là các liên kết đến một tập hợp hạn chế các nhiệm vụ được định nghĩa trong db. Bạn có thể nghĩ về chúng như là các mục trong một liệt kê các nhiệm vụ. Ngoài ra Project.tasks.clear ngay lập tức nhấn db.

Trong thế giới java, sử dụng Hibernate, tôi sẽ ngắt kết nối thực thể khỏi phiên và có thể sửa đổi thực thể trong bộ nhớ cho đến khi kết nối lại và lưu.

Cảm ơn

+0

Điều này có vẻ là một vấn đề tương tự với câu hỏi của tôi: http://stackoverflow.com/questions/11353582/delete-associated-records-when-model-is-saved – iblue

+0

Nó không vi phạm RoR: has_many logic? –

Trả lời

2

Bạn đã thử sử dụng thuộc tính task_ids?

Thay đổi mã của bạn để:

Project.tasks_ids = [] 
Project.tasks_ids << task1.id 
Project.tasks_ids << task2.id 

Tôi biết câu hỏi này là một chút cũ, nhưng kể từ khi tôi cố gắng tìm kiếm một vấn đề tương tự trên Google Tôi nghĩ điều này có thể có ích cho người khác.