Sử dụng Rails. Tôi có đoạn mã sau:Truy vấn phức tạp Rails để đếm các bản ghi duy nhất dựa trên bảng chân lý
class TypeOfBlock < ActiveRecord::Base
has_and_belongs_to_many :patients
end
class Patient < ActiveRecord::Base
has_and_belongs_to_many :type_of_blocks, dependent: :destroy
end
Với những bộ bàn:
╔══════════════╗
║type_of_blocks║
╠══════╦═══════╣
║ id ║ name ║
╠══════╬═══════╣
║ 1 ║ UP ║
║ 2 ║ LL ║
║ 3 ║ T ║
╚══════╩═══════╝
╔═══════════════════════════════╗
║ patients_type_of_blocks ║
╠══════════════════╦════════════╣
║ type_of_block_id ║ patient_id ║
╠══════════════════╬════════════╣
║ 1 ║ 1 ║
║ 1 ║ 2 ║
║ 2 ║ 2 ║
║ 3 ║ 3 ║
║ 2 ║ 4 ║
║ 1 ║ 5 ║
║ 1 ║ 6 ║
║ 2 ║ 6 ║
║ 3 ║ 6 ║
╚══════════════════╩════════════╝
Tôi muốn đếm số lượng bệnh nhân độc đáo phụ thuộc vào loại kết hợp khối, đây là kết quả mong đợi:
# Expected results (just like a truth table)
UP (patient with type_of_block_id 1 only) = 2 patient
UP + LL (patient with type_of_block_ids 1 and 2) = 1 patient
UP + T (patient with type_of_block_ids 1 and 3) = 0 patient
LL (patient with type_of_block_id 2 only) = 1 patient
LL + T (patient with type_of_block_ids 2 and 3) = 0 patient
T (patient with type_of_block_id 3 only) = 1 patient
UP + LL + T (patient with type_of_block_ids 1, 2 and 3) = 1 patient
Tôi đã cố gắng tham gia các bảng như sau:
up_ll =
TypeOfBlock.
joins("join patients_type_of_blocks on patients_type_of_blocks.type_of_block_id = type_of_blocks.id").
where("patients_type_of_blocks.type_of_block_id = 1 and patients_type_of_blocks.type_of_block_id = 2").
size
Nhưng có quá nhiều phức tạp, và con số là sai. Tôi muốn thử SQL thô, nhưng Rails 4 không dùng nó và yêu cầu tôi phải làm ModelClass.find_by_sql
.
Làm cách nào để tạo kết quả mong đợi ở trên?
này là siêu tuyệt vời. Chỉ đánh dấu điều này là câu trả lời không làm công lý của nó. Tôi sẽ đợi thêm 1 ngày nữa, sau đó cho bạn tiền thưởng cho việc này. Cám ơn rất nhiều. – Victor
Cảm ơn bạn, niềm vui của tôi! :) Và tuyệt vời mà bạn bắt gặp lỗi đánh máy (tôi đã thử nghiệm nó trên các mô hình khác nhau tại địa phương). – BoraMa
**** Nó có thể được mở rộng để xử lý số không chỉ sử dụng MySQL. Nếu quan tâm kiểm tra câu trả lời của tôi :) – lad2025