2010-10-28 16 views
10

Tôi đang cố giữ mô hình logic trong mô hình của mình, nhưng tôi không thể làm cho nó thực hiện các sửa đổi trên chính nó và để chúng tồn tại trong cơ sở dữ liệu.Rails: Làm cách nào để gọi `self.save` trong mô hình của tôi và nó tồn tại trong cơ sở dữ liệu?

Trong điều khiển của tôi:

@article.perform_some_calulcations! 

Trong mô hình của tôi:

def perform_some_calculations! 
    self.foo.gsub!(/regexp/, 'string') 
    self.save 
end 

Nếu tôi thả debugger báo cáo vào phương pháp của tôi và sau khi cuộc gọi của tôi để nó trong bộ điều khiển, @article.foo có giá trị đúng. Tuy nhiên, khi tôi tiếp tục, nó không tồn tại trong cơ sở dữ liệu và webrick không báo cáo bất kỳ câu lệnh UPDATE nào.

Có gì không ổn? Tôi không biết liệu tôi có phải làm điều này trước đây hay không, nhưng chắc chắn nó có thể đúng không?

Trả lời

16

Vấn đề của bạn là nếu bạn sửa đổi một thuộc tính "tại chỗ", điều này có nghĩa là: không gán cho nó một giá trị mới, sau đó Rails sẽ nghĩ rằng không có gì mới là được cứu rỗi, vì vậy nó " tối ưu hóa "tiết kiệm đi.

Mỗi bộ ghi truy nhập thuộc tính của bạn sẽ đặt cờ, vì vậy phương thức lưu sẽ biết rằng nó nên kiểm tra xem giá trị hiện tại có thực sự khác với giá trị được đọc từ cơ sở dữ liệu hay không. Đó là lý do tại sao self.foo = self.foo.gsub(/regexp/, 'string') hoạt động (lưu ý rằng dấu chấm than là không cần thiết ở đây).

Nếu bạn cần phải sửa đổi một thuộc tính "tại chỗ", ví dụ với gsub! hoặc replace, sử dụng:!

def perform_some_calculations! 
    foo_will_change! 
    self.foo.gsub!(/regexp/, 'string') 
    self.save 
end 
+0

Cảm ơn thông tin bổ sung – nfm

+0

Nên được đánh dấu là câu trả lời IMHO – Kangur

+0

Đây có phải là một thực hành tốt không? tức là mô hình gọi là tự lưu sau khi tính toán điều gì đó? – Nicolas

2

Thuộc tính của bạn có thể được bảo vệ. Kiểm tra nhật ký của bạn. Nếu đó là trường hợp sau đó

self.save! 

hoặc

self.save(false) 

thử dùng các dấu chấm than chỉ ra định nghĩa của bạn.


self.foo = self.foo.gsub!(/regexp/, 'string') 
+0

Ý tưởng tốt, nhưng 'self.save 'và' self.save (false) ' cả hai đều có cùng kết quả. Không có dấu hiệu 'attr_protected' ở bất kỳ đâu hoặc bất kỳ cảnh báo nào trong nhật ký webrick. – nfm

+0

thử dùng dấu chấm than ngoài định nghĩa của bạn. – s84

+0

Không có con xúc xắc nào khi xóa '!' Khỏi tên phương thức – nfm

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