6

Vì vậy, tôi có mã trong ứng dụng của tôi mà gắn thêm vào một mối quan hệ has_many với các nhà điều hành "< <" như vậy:Rails ActiveRecord Shovel (<<) điều hành

class BlogPost < ActiveRecord::Base  
    has_many :comments 

    def add_comment(content) 
     @new_comment = Comment.create(content) 
     self.comments << @new_comment 
    end 
end 

Và có vẻ như để làm việc. Tôi không bao giờ thực sự đặt câu hỏi hoặc tự hỏi khi nào nó gọi là "cứu" (tôi đoán tôi chưa bao giờ có một sự hiểu biết mạnh mẽ về thời điểm gọi là "cứu" để bắt đầu).

Tuy nhiên, có vẻ như rằng after_save móc trên ý kiến ​​không được kích hoạt trong add_comment chức năng của tôi, trong đó nhắc nhở tôi để hỏi:

Làm thế nào để công việc << nhà điều hành trong activerecord và nơi tôi có thể đọc thêm về nó ?

Cảm ơn

Trả lời

12

Khi bạn sử dụng shovel điều hành (<<), Rails sẽ tự động lưu các đối tượng liên quan. Vì vậy, khi bạn làm điều này:

self.comments << @new_comment 

@new_comment được thêm vào bộ sưu tập comments và ngay lập tức bắn cập nhật SQL mà không cần chờ cho tiết kiệm hoặc cập nhật cuộc gọi trên đối tượng phụ huynh, trừ trường hợp đối tượng cha mẹ là một kỷ lục mới.

Từ this documentation

bộ sưu tập < < (object, ...) Thêm một hoặc nhiều đối tượng đến việc thu thập bởi tạo các hiệp hội trong bảng tham gia (collection.push và collection.concat là bí danh để phương pháp này). Lưu ý rằng thao tác này ngay lập tức kích hoạt cập nhật SQL mà không phải đợi để lưu hoặc gọi cập nhật trên đối tượng mẹ, trừ khi đối tượng mẹ là bản ghi mới .

+4

Oh tôi thấy, tôi đã có rất nhiều rắc rối tìm kiếm "<<" - tốt đẹp để biết nó được gọi là "Shovel" hành :) – cozos

+1

thực sự nó tiết kiệm kỷ lục đẩy chỉ nếu mục "cha mẹ" phản hồi đúng "vẫn tồn tại?". Nếu bạn gọi "<<" trên new_record, nó không lưu trên db. – sekmo

0

bộ sưu tập < < (object, ...)

Thêm một hoặc nhiều đối tượng đến việc thu thập bằng cách tạo ra các hiệp hội trong bảng tham gia (collection.push và collection.concat là bí danh để phương pháp này) hoặc bằng cách đặt khóa ngoại của họ cho khóa chính của bộ sưu tập . Lưu ý rằng thao tác này ngay lập tức kích hoạt cập nhật SQL mà không phải đợi lệnh lưu hoặc cập nhật đối tượng cha mẹ, trừ khi đối tượng mẹ là bản ghi mới.

Ví dụ:

class Group < ActiveRecord::Base 
    has_many :users 
    has_many :avatars, through: :users 
end 

class User < ActiveRecord::Base 
    belongs_to :group 
    has_one :avatar 
end 

class Avatar < ActiveRecord::Base 
    belongs_to :user 
end 

@group.avatars << Avatar.new # this would work if User belonged_to Avatar rather than the other way around 
Các vấn đề liên quan