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_indicators
phươ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 all
là 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
where
mỗi lần. - Khi chạy một
def self.subjects
phươ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.scoped
như 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 ...