Tôi có một mảng các đối tượng, hãy gọi nó là một Indicator. Tôi muốn chạy các phương thức lớp Indicator (những phương thức def self.subjectsđa dạng, phạm vi, v.v.) trên mảng này. Cách duy nhất tôi biết để chạy các phương thức lớp trên một nhóm đối tượng là đặt chúng là một ActiveRecord :: Relation. Vì vậy, tôi kết thúc bằng cách thêm một to_indicatorsphương thức vào Array.
def to_indicators
# TODO: Make this less terrible.
Indicator.where id: self.pluck(:id)
end
Đôi khi tôi xâu chuỗi khá nhiều phạm vi này để lọc ra kết quả, trong các phương thức của lớp. Vì vậy, mặc dù tôi gọi một phương thức trên ActiveRecord :: Relation, tôi không biết cách truy cập đối tượng đó. Tôi chỉ có thể xem nội dung của nó thông qua all. Nhưng alllà một mảng. Vì vậy, sau đó tôi phải chuyển đổi mảng đó thành ActiveRecord :: Relation. Ví dụ, đây là một phần của một trong các phương pháp:
all.to_indicators.applicable_for_bank(id).each do |indicator|
total += indicator.residual_risk_for(id)
indicator_count += 1 if indicator.completed_by?(id)
end
Tôi đoán điều này ngưng tụ thành hai câu hỏi.
- Làm cách nào để chuyển đổi một Mảng đối tượng thành ActiveRecord :: Relation? Tốt hơn là không làm
wheremỗi lần. - Khi chạy một
def self.subjectsphương thức kiểu trên ActiveRecord :: Relation, làm cách nào để truy cập vào chính đối tượng ActiveRecord :: Relation đó?
Cảm ơn. Nếu tôi cần làm rõ bất cứ điều gì, hãy cho tôi biết.
.all, chỉ cần sử dụng.scopednhư câu trả lời của Andrew Marshall đã chỉ ra (Mặc dù trong rails 4, nó sẽ hoạt động với.all). Nếu bạn thấy mình cần phải biến một mảng vào một mối quan hệ bạn đã ở đâu đó sai ra đi ...