PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Rails 3.2 - phương thức không xác định `where 'for #

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lọc theo phạm vi ngày (cùng tháng và ngày) qua các năm

  2. Cách thực hiện truy vấn ActiveRecord nhóm này trong postgres

  3. Dữ liệu C # hàng loạt vào bảng postgresql

  4. Các hợp tác mạnh mẽ hơn với hỗ trợ ICU trong PostgreSQL 10

  5. quote_ident () không thêm dấu ngoặc kép vào tên cột trước