2015-03-30 14 views
5

Tôi đang tìm kiếm một ví dụ Rails 4 rõ ràng về cách lọc các bản ghi dựa trên dữ liệu liên quan đến chúng thông qua một bảng khác.Rails Query: Lọc theo thuộc tính trong bảng khác

Giả sử tôi có mô hình Người dùng và mô hình Nhận xét. Người dùng has_many nhận xét và nhận xét belongs_to người dùng. Nhận xét cũng có cột score trong bảng của nó.

class User < ActiveRecord::Base 
    has_many :comments 
end 

Users 
| id | name | email    | 
|-----|---------|---------------------| 
| 1 | "Alice" | "[email protected]" | 
| 2 | "Bob" | "[email protected]" | 
| ...         | 

class Comment < ActiveRecord::Base 
    belongs_to :user 
end  

Comments 
| id | score | content   | user_id | 
|-----|-------|------------------|---------| 
| 1 | 0  | "lol"   | 2  | 
| 2 | 2  | "more like love" | 3  | 
| ...          | 

Làm thế nào tôi có thể có được tất cả người dùng đã thực hiện một bình luận với nội dung "k" mà có một số điểm> 0? Lưu ý rằng những gì tôi muốn trả lại là Người dùng, không phải là Nhận xét.


Ngoài ra, hãy xem xét một ví dụ phức tạp hơn, trong đó một người dùng has_many ý kiến ​​và thích, nhận xét belong_to một người sử dụng, và một Nhận xét has_many Likes. Thích belong_to một Người dùng và belong_to một Nhận xét. Lưu ý rằng score không còn là một yếu tố trong ví dụ này.

class User < ActiveRecord::Base 
    has_many :comments 
    has_many :likes 
end 

Users 
| id | name | email    | 
|-----|---------|---------------------| 
| 1 | "Alice" | "[email protected]" | 
| 2 | "Bob" | "[email protected]" | 
| ...         | 

class Comment < ActiveRecord::Base 
    belongs_to :user 
    has_many :likes 
end 

Comments 
| id | content   | user_id | 
|-----|------------------|---------| 
| 1 | "lol"   | 2  | 
| 2 | "more like love" | 3  | 
| ...        | 

class Like < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :comment 
end 

Likes 
| id | user_id | comment_id | 
|-----|---------|------------| 
| 1 | 1  | 2   | 
| 2 | 4  | 3   | 
| ...      | 

Trong ví dụ thứ hai này, làm thế nào tôi sẽ tìm thấy tất cả các Người sử dụng có bao giờ đã một trong những ý kiến ​​của họ thích bởi người dùng có tên là 'Fonzie'?

Trả lời

4

Để trả lời câu hỏi đầu tiên của bạn. Bạn cần phải tạo một cấu trúc bảng mới tham chiếu đến liên kết giữa bảng người dùng và nhận xét.

Điều này có thể đạt được bằng User.joins(:comments). Bây giờ bạn có một bảng có tất cả người dùng có nhận xét được liên kết của họ. Để áp dụng bộ lọc của bạn, bạn chỉ đơn giản có thể làm:

User.joins(:comments) .where("comments.content = ? AND comments.score > ?", 'some_content', 0)

Nếu bạn không quen với việc trên, tôi đề nghị bạn đọc rails guidelines on queries - tìm kiếm cho 'Cùng Bàn'

Từ ví dụ thứ hai là một phức tạp hơn một chút, tôi khuyên bạn nên tự làm quen với các hướng dẫn ở trên.

Các vấn đề liên quan