Trong dòng đầu tiên, bạn đã trả lại thành công ActiveRecordRelation
đối tượng trong @alarmsT
# Extracts those alarms that are ACTIVE and have something in common with the tittles
@alarmsT = Alarm.activated.where("keyword in (?)", [@header.title_es, @header.title_en, @header.title_en])
Tại thời điểm này, bạn có thể áp dụng thêm .where(...)
phương pháp, điều kiện hoặc phạm vi trên @alarmsT
để xây dựng thêm biểu thức ARel và kết quả trả về.
Tuy nhiên, sau đó bạn chạy bộ lọc qua mối quan hệ này, chuyển đổi @alarmsT
đến một bản sao của Array
# Extracts alarms when Header has at least the same categories as an alarm
@alarmsT = @alarmsT.select do |alarm|
@header.category_ids.all?{|c| alarm.category_ids.include? c }
end
Bạn không thể xây dựng biểu thức ARel nữa, vì Array
không biết về .where(...)
của ARel của bạn hoặc bất kỳ Alarm
nào của bạn phạm vi hoặc thuộc tính của mô hình. Đây là lý do tại sao trong đoạn mã bên dưới, bạn nhận được undefined method 'where' for #<Array:...
lỗi - bạn đang gọi .where()
trên một bản sao của Array
; một phương thức không tồn tại.
@alarmsF = []
@header.events.each do |e|
@alarmsF = @alarmsF + @alarmsT.where("alarms.location LIKE ?", e.town)
end
Bạn có thể khắc phục điều này bằng cách không thực hiện chọn để lọc theo id danh mục và thay vào đó bằng cách sử dụng kết hợp. Việc xây dựng một liên kết như vậy (để xác minh sự tồn tại của ít nhất một tập hợp con các giá trị trong một bảng / cột có liên quan) được ghi lại khá nhiều trên các địa điểm dễ dàng tìm thấy thông qua google và tại đây trên StackOverflow.