2012-03-15 19 views
8

ActiveRecord::Base có API lớn với nhiều phương thức cho cả đối tượng tìm kiếm và lưu. Ví dụ, AR::B đối tượng của bạn có thể đã được khởi tạo từ một số phương pháp:Làm thế nào để bạn khai thác ActiveRecord :: Phương pháp cơ sở mà không đưa ra các giả định về cách nó được sử dụng?

  • Foo.new(…)
  • Foo.create(…)
  • Foo.find(…)
  • Foo.find_by_sql(…)
  • Foo.find_[all_]by_*(…)
  • bar.foos (hiệp hội)
    • ... và tìm phương pháp trên hiệp hội, tất nhiên

Tương tự như vậy, các đối tượng trong câu hỏi có thể được tồn bởi một vài phương pháp khác nhau:

  • foo.create hoặc foo.create!
  • foo.save hoặc foo.save!
  • foo.update_attributes hoặc foo.update_attributes!

Bây giờ, khi viết các bài kiểm tra đơn vị, thực hành tốt là thực hiện các cuộc gọi phương thức bên ngoài để kiểm tra của bạn có thể tập trung vào logic nghiệp vụ của phương pháp được đề cập. Tuy nhiên, khi làm việc với các đối tượng AR::B - ví dụ trong các kiểm tra đơn vị điều khiển - có vẻ như bạn phải cam kết với một trong các phương pháp trên, khi thực sự xa như logic nghiệp vụ của phương pháp thì không nên quan trọng mà bạn chọn.

Bạn có phải kết hợp hành vi của phương pháp của bạn một cách chặt chẽ với việc triển khai của nó hay tôi thiếu một vài thứ đơn giản?

Trả lời

3

Một cách tiếp cận là xây dựng các lớp học theo cách sao cho bạn kết thúc các cuộc gọi phương thức ActiveRecord::Base theo cách riêng của mình.

Vì vậy, thay vì gọi Foo.new(…) trực tiếp ...

class Foo < ActiveRecord::Base 
    def self.create_object(…) 
    new(…) 
    end 
end 

Bằng cách đó trong các thử nghiệm của bạn, bạn có thể còn sơ khai ra phương pháp riêng của bạn thay vì ActiveRecord của.

Cách tiếp cận này (bao gồm cả 'lợi ích' của nó được nêu chi tiết bởi Avdi Grimm trong cuốn sách 'Objects On Rails' ... http://objectsonrails.com