2012-03-22 25 views
10

Câu hỏi Noob dành cho Ruby on Rails- đây là ví dụ về tình huống của tôi: Nếu tôi có mẫu circle và thuộc tính radius, tôi tính toán ở đâu cho circumference? Đây có phải là trong mô hình hoặc bộ điều khiển, và nó trông như thế nào? circumference sẽ cần truy cập được trong số views của tôi.Đường ray - Tôi nên tính các thuộc tính bắt nguồn ở đâu?

Ngoài ra, tôi có đúng khi nghĩ rằng tôi không cần phải tạo một thuộc tính là một phần của mô hình/cơ sở dữ liệu của tôi vì nó có thể được lấy từ người dùng nhập radius?

Trả lời

14

Logic để tính thuộc tính bắt nguồn hoàn toàn thuộc về mô hình. Chu vi là thuộc tính của vòng tròn, không phải là mối quan tâm về cách bạn trình bày nó trong giao diện web.

Để truy cập chu vi từ bất cứ đâu, chỉ cần xác định một phương thức trên lớp, chẳng hạn như sau:

require 'mathn' 
class Circle < ActiveRecord::Base 
    # assume `radius` column exists in the database 

    def circumference 
    Math::PI * 2 * radius 
    end 
end 

Vì đây là tính toán khá rẻ để tính toán chu vi, bạn chỉ có thể tính toán nó khi cần thiết . Nếu nó là cái gì đó liên quan đến tính toán phức tạp hơn mà bạn không muốn chạy nhiều lần, bạn có thể memoize nó như sau:

def circumference 
    @circumference ||= Math::PI * 2 * radius 
end 

Điều đó sẽ đặt biến @circumference dụ lần đầu tiên phương pháp này được gọi, sau đó trả về kết quả của phép tính đầu tiên trên mọi cuộc gọi tiếp theo. Nếu bạn đã làm điều đó, bạn cần phải đảm bảo đặt @circumference thành nil khi bán kính thay đổi để đảm bảo nó chính xác.

+0

Trở lại điểm mặc dù, tôi nên làm rõ với giả định thứ hai của mình - tôi đã tìm ra các phép tính của mình trong 'app/models/circle.rb', nhưng tôi có thể sử dụng' circumference' làm đơn giản biến (ví dụ: '@ circumference' instance variable) hoặc tôi có cần thêm nó như là một phần tử của bảng cơ sở dữ liệu cho' circle' không? – Nick

+1

Nếu bạn thêm 'attr' này vào bảng của mình thì bạn cần mã bổ sung để đảm bảo rằng các thay đổi đối với' radius' của bạn cũng sau đó kích hoạt tính toán lại 'chu vi' của bạn. Điều này đòi hỏi 'def' của thuộc tính được xử lý hơi khác so với câu trả lời này. –

+0

'before_save: recalculate_fields' –

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