2013-06-20 31 views
7

Tôi có gọi ActiveRecord sau:ActiveRecord tồn tại? với các hiệp hội

@payment = account.business.payments.find(params[:id]) 

nào tìm kiếm thông qua các hiệp hội cho một payment với id của params[:id]. Tuy nhiên, điều này ném một ngoại lệ RecordNotFound.

Tôi muốn gọi số exists? để xem liệu bản ghi có tồn tại để tránh ném ngoại lệ hay không. Làm Payment.exists?(account.business.payments.find(params[:id])) không hoạt động.

Tôi chỉ muốn tìm kiếm payments rằng belong_to rằng business và không phải tất cả thanh toán bằng cách thực hiện Payment.exists?(:id => params[:id]). Đó là vì vậy tôi có thể biết rằng đó là khoản thanh toán của doanh nghiệp cụ thể của tài khoản.

Tôi có thể làm như thế nào?

Lưu ý: account has_one businessbusiness has_many payments.

+0

vì bạn đang tìm kiếm một id, bạn không thể sử dụng 'Payment.find (params [: id ]) 'thay vì có con đường thực sự dài đó? – sircapsalot

+2

@sircapsalot: OP có thể muốn giới hạn phạm vi vì lý do bảo mật ... – PinnyM

+0

@PinnyM Đó là lý do. – darksky

Trả lời

12

Sử dụng where thay vì find, nó sẽ trả về một ActiveRecord::Relation đại diện cho 0 hoặc nhiều hồ sơ, ngoài khơi trong đó bạn có thể chuỗi .exists?:

@payments = account.business.payments.where(id: params[:id]) 


if @payments.exists? 
    # ... 
end 
3

Nếu bạn chỉ cần để kiểm tra sự tồn tại:

account.business.payments.where(:id => params[:id]).exists? 

Nếu bạn có kế hoạch sử dụng hồ sơ này, sau đó gọi .first thay vì exists? vì chỉ có 1 kỷ lục dự kiến. Ngẫu nhiên, bạn cũng có thể làm điều này bằng Finders động (được tán thành trong Rails 4):

account.business.payments.find_by_id(params[:id]) 

này sẽ trở lại nil nếu không có hồ sơ tồn tại (thay vì thổi lên).

+0

Thay vì công cụ tìm kiếm động bạn có thể sử dụng 'account.business.payments.where (: id => params [: id]). first' –

+0

@WizardofOgz: đó là lần đầu tiên giải pháp (nơi tôi khuyên bạn nên sử dụng '.first' nếu bản ghi sẽ thực sự được sử dụng). – PinnyM

+0

Rất tiếc, xin lỗi, tôi thực sự không đọc câu trả lời của bạn ngay lần đầu tiên. Tôi đã upvoted nó anyway ;-) Chúc mừng –

0

Ai đó có thể bác bỏ nếu tôi sai, nhưng tôi sẽ đề nghị

account.business.payments.where(:id => params[:id]).pluck(:id).present? 

Bằng cách thực hiện thao tác ngắt, bạn sẽ bỏ qua việc khởi tạo đối tượng liên quan. Điều này có nghĩa là chúng không cần phải được nạp vào bộ nhớ mà sẽ tiết kiệm được một số chu kỳ nếu bạn đang làm việc này rất nhiều

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