2012-01-15 20 views
6

Tôi đang sử dụng Rails 3.1.0 và tôi muốn "chạm" mô hình gốc của liên kết belongs_to chỉ khi đáp ứng các điều kiện nhất định.Làm cách nào để "chạm" mô hình gốc của liên kết `thuộc_to` chỉ khi các điều kiện nhất định được đáp ứng?

Ví dụ, vào thời điểm này tôi có:

belongs_to :article, 
    :touch => true 

tôi sẽ "chạm" mô hình mẹ chỉ khi nó là "công cộng". Đó là, lớp Article có thuộc tính có tên access (@article.access =>public hoặc private) và tôi muốn kiểm tra giá trị này trước khi "đụng chạm": nếu giá trị này là khôngpublic, sau đó "chạm" nó!

Có thể thực hiện điều đó "trực tiếp" trong tuyên bố liên kết belongs_to không? Nếu vậy, làm thế nào?

Trả lời

4

Bạn có thể thử lambda như bạn nói nhưng Tôi không chắc liệu nó có hoạt động không. Một cái gì đó như thế này:

belongs_to :article, :touch => Proc.new{|o| o.article && o.article.public } 

Theo implementation có lẽ bạn có thể thử để trở nil thay vì false trong proc, khi nó không có sẵn

belongs_to :article, :touch => Proc.new{|o| o.article && o.article.public ? true : nil } 

Nếu đây không hoạt động sử dụng một trước khi lưu gọi lại như sau:

class Model < ActiveRecord::Base 
    belongs_to :article 

    before_save :touch_public_parent 

    def touch_public_parent 
    article.touch if article && article.public? 
    end 
end 

Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi nào.

Update # 1

Phần liên quan từ add_touch_callbacks:

if touch_attribute == true 
    association.touch unless association.nil? 
else 
    association.touch(touch_attribute) unless association.nil? 
end 

Vì vậy, nếu bạn vượt qua sự thật, sau đó thực hiện một liên lạc đơn giản trên updated_at thuộc tính. Nếu bạn chuyển tên trường, hãy cập nhật trường đó trừ khi bạn vượt qua nil. Nếu bạn vượt qua nil không cập nhật gì cả. Đó là lý do tại sao tôi nói rằng có thể bạn có thể thử phiên bản thứ hai của hiệp hội belongs_to.

+0

Không có tài liệu nào liên quan đến phương thức 'add_touch_callbacks' mà bạn đã liên kết trong câu trả lời ... bạn có thể nói thêm một chút về điều đó (ví dụ: cách hoạt động) không? – Backo

+0

@Backo Chắc chắn, vui lòng xem câu trả lời cập nhật của tôi. – dombesz

+0

Cảm ơn bạn rất nhiều. Hẹn gặp các bạn câu hỏi/câu trả lời tiếp theo! – Backo

0

Tôi không nghĩ bạn có thể áp dụng liên lạc với điều kiện trong liên kết thuộc tính.

Có một cách mà là một chút hacky nhưng sẽ làm việc trực tiếp với một hiệp hội belongs_to,

Điều này có thể không phải là cách khuyến khích

 
class YourModel 
    belongs_to :article 
    belongs_to :public_article, :class_name=> "Article", 
      :foreign_key => "article_id", 
      :conditions => {:public => true} , :touch => true 
end 
+0

Có thể sử dụng một số 'Proc' /' lambda' trong giá trị tùy chọn ': touch' không? – Backo

+0

không bạn không thể sử dụng proc hoặc lambda, trích dẫn từ tài liệu, ": touch => Nếu đúng, đối tượng liên kết sẽ được chạm (thuộc tính updated_at/on được đặt thành bây giờ) khi bản ghi này được lưu hoặc hủy. Nếu bạn chỉ định một biểu tượng, thuộc tính đó sẽ được cập nhật với thời gian hiện tại ngoài thuộc tính updated_at/on. " –

+0

Tôi vừa mở một câu hỏi khác để tiếp cận một giải pháp khác: http://stackoverflow.com/questions/8872045/there-is-a-way-to-handle-after-save-and-after-destroy-equally. – Backo

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