Tôi hiểu rằng bạn muốn nhận các phần mà bản sửa đổi cuối cùng của từng phần có parent_section_id = 1;
Tôi có tình huống tương tự, trước tiên, đây là SQL (hãy xem các danh mục dưới dạng phần cho bạn, bài đăng dưới dạng sửa đổi và user_id dưới dạng parent_section_id-lo ngại nếu tôi không chuyển mã theo nhu cầu của bạn nhưng tôi phải đi):
SELECT categories.*, MAX(posts.id) as M
FROM `categories`
INNER JOIN `posts`
ON `posts`.`category_id` = `categories`.`id`
WHERE `posts`.`user_id` = 1
GROUP BY posts.user_id
having M = (select id from posts where category_id=categories.id order by id desc limit 1)
Và đây là truy vấn trong Rails:
Category.select("categories.*, MAX(posts.id) as M").joins(:posts).where(:posts => {:user_id => 1}).group("posts.user_id").having("M = (select id from posts where category_id=categories.id order by id desc limit 1)")
này hoạt động, nó là xấu xí, tôi nghĩ cách tốt nhất là để "cắt" truy vấn, nhưng nếu bạn có quá nhiều phần đó sẽ là một vấn đề trong khi vòng lặp máng chúng; bạn cũng có thể đặt truy vấn này vào một phương thức tĩnh và ý tưởng đầu tiên của bạn, có một revision_id bên trong bảng phần của bạn sẽ giúp tối ưu hóa truy vấn, nhưng sẽ giảm bình thường hóa (đôi khi cần) và bạn sẽ phải cập nhật trường này khi sửa đổi mới được tạo cho phần đó (vì vậy nếu bạn định thực hiện nhiều sửa đổi trong cơ sở dữ liệu khổng lồ thì có thể sẽ là một ý tưởng tồi nếu bạn có máy chủ chậm ...)
CẬP NHẬT tôi đã trở lại hehe, tôi đã làm một số xét nghiệm và kiểm tra này:
def last_revision
revisions.last
end
def self.last_sections_for(parent_section_id)
ids = Section.includes(:revisions).collect{ |c| c.last_revision.id rescue nil }.delete_if {|x| x == nil}
Section.select("sections.*, MAX(revisions.id) as M")
.joins(:revisions)
.where(:revisions => {:parent_section_id => parent_section_id})
.group("revisions.parent_section_id")
.having("M IN (?)", ids)
end
tôi đã thực hiện truy vấn này và làm việc với các bảng của tôi (hy vọng tôi đặt tên tốt params, nó là cùng một truy vấn Rails từ trước nhưng tôi thay đổi truy vấn trong việc tối ưu hóa); xem ra nhóm; bao gồm làm cho nó tối ưu trong datasets lớn, và xin lỗi tôi không thể tìm thấy một cách để làm cho một mối quan hệ với has_one, nhưng tôi sẽ đi với điều này, nhưng cũng xem xét lại các lĩnh vực mà bạn đề cập ở đầu.
Tuyệt vời, Cảm ơn! –