2011-12-06 29 views
12

vấn đề cố định ... Hóa ra là có một phương pháp kỷ lục hoạt động đó đã vượt qua bằng văn bản, bây giờ tất cả mọi thứ công trình như mong đợiLàm thế nào để bạn thiết lập phạm vi thể kết nối dựa trên các mối quan hệ trong Mongoid

Tôi cố gắng để thiết lập phạm vi để tôi có thể thực hiện cuộc gọi mà trông giống như

Competitor.of_type(type).at_event(event) 

rằng sẽ trả lại tất cả đối thủ cạnh tranh của loại hình đó tham dự sự kiện Mô hình của tôi trông giống như

class Competitor < Competitor 
    belongs_to :type 
    has_and_belongs_to_many :events 
    scope :at_event, ->(event) {where(:event_ids.in => event.competitor_ids)} 
    scope :of_type, ->(type) where(:type_id => type.id)     
end 

Các công trình sau đây (trở lại tiêu chí mongoid)

Competitor.of_type(type) 
Competitor.at_event(event) 

Nhưng khi tôi chuỗi chúng, nó in ra cái gì đó trông như thế này:

#<Competitor:0x00000109e2b210> 
#<Competitor:0x00000109e2ab08> 
-------=-=------------------------------------ 
=> #<Mongoid::Criteria 
selector: {}, 
options: {}, 
class: Competitor, 
embedded: false> 

Có một entry đối thủ cạnh tranh đối với mỗi đối thủ cạnh tranh. of_type (loại) (tiêu chuẩn chuỗi đầu tiên) và nếu tôi chạy .count trên truy vấn, tôi nhận được tổng số đối thủ cạnh tranh trong cơ sở dữ liệu.

Ở phía trên cùng của tài liệu mongoid cho phạm vi, nó nói Tất cả các phạm vi có thể chuỗi và cũng có thể được áp dụng cho các liên kết, sau này được thảo luận trong phần quan hệ. Thật không may là tôi không nhìn thấy một phần quan hệ phụ, tôi không thể tìm thấy một tham chiếu duy nhất cho phạm vi trong phần quan hệ chính.

tôi đã có thể để có được những điều sau đây để trả lại kết quả tôi muốn:

where(:id.in => event.competitor_ids).where(:type_id => type.id) 

nhưng nếu bất kỳ phần nào của truy vấn được chia thành một phương pháp riêng biệt hoặc phạm vi nó không thành công và cung cấp kết quả tôi đã giới thiệu ở trên.

+0

Vui lòng hỏi câu hỏi của riêng bạn và đánh dấu câu hỏi là đã giải quyết. –

Trả lời

8

phạm vi

Tương tự như Active Record, Mongoid cho phép bạn xác định phạm vi trên mô hình của bạn như là một tiện nghi cho bộ kết quả lọc. Phạm vi được xác định ở cấp lớp, hoặc sử dụng macro phạm vi hoặc bằng cách xác định lớp các phương thức trả về đối tượng tiêu chí. Tất cả các phạm vi là chainable và có thể được áp dụng cho các hiệp hội là tốt, sau này được thảo luận trong phần quan hệ.

Phạm vi được đặt tên được xác định ở cấp lớp bằng macro phạm vi và có thể được tạo chuỗi để tạo kết quả trong DSL đẹp.

class Person 
    include Mongoid::Document 
    field :occupation, type: String 
    field :age, type: Integer 

    scope :rock_n_rolla, where(occupation: "Rockstar") 
    scope :washed_up, where(:age.gt => 30) 
    scope :over, ->(limit) { where(:age.gt => limit) } 
end 

# Find all the rockstars. 
Person.rock_n_rolla 

# Find all rockstars that should probably quit. 
Person.washed_up.rock_n_rolla 

# Find a criteria with Keith Richards in it. 
Person.rock_n_rolla.over(60) 

Lưu ý rằng định nghĩa được đánh giá ở thời gian tải lớp. Để đánh giá khi chạy, bạn sẽ muốn đảm bảo xác định bằng cách sử dụng số proc hoặc lambda. Trong ví dụ sau, ngày đầu tiên được đặt là ngày tải lớp, trong đó phạm vi thứ hai đặt ngày tại thời điểm phạm vi được gọi.

scope :current, where(:start_date.lte => Date.today) 
scope :current, -> { where(:start_date.lte => Date.today) } 

phương pháp lớp

Đối với những người muốn có một cú pháp kiểu dữ liệu Mapper, phương pháp lớp đó trở lại tiêu chí có thể được coi là phạm vi thể kết nối là tốt.

class Person 
    include Mongoid::Document 
    field :occupation, type: String 
    field :age, type: Integer 

    class << self 

    def rock_n_rolla 
     where(occupation: "Rockstar") 
    end 

    def washed_up 
     where(:age.gt => 30) 
    end 

    def over(limit) 
     where(:age.gt => limit) 
    end 
    end 
end 

# Find all the rockstars. 
Person.rock_n_rolla 

# Find all rockstars that should probably quit. 
Person.washed_up.rock_n_rolla 

# Find a criteria with Keith Richards in it. 
Person.rock_n_rolla.over(60) 

Phạm vi được đặt tên và phương pháp lớp trả về tiêu chí có thể được xích lại với nhau - đó là vẻ đẹp của API tiêu chí mạnh mẽ của Mongoid.

class Person 
    include Mongoid::Document 
    field :occupation, type: String 
    field :age, type: Integer 

    scope :washed_up, where(:age.gt => 30) 
    scope :over, ->(limit) { where(:age.gt => limit) } 

    def self.rock_n_rolla 
    where(occupation: "Rockstar") 
    end 
end 

# Same queries apply here as well. 
Person.rock_n_rolla 
Person.washed_up.rock_n_rolla 
Person.rock_n_rolla.over(60) 
+0

Làm cách nào để sử dụng tính năng này để tìm tất cả các mô hình trong mối quan hệ với mô hình hiện tại? Ví dụ: 'Person.rock_n_rolla.bands' để tôi có được tất cả các ban nhạc thuộc về những người có nghề nghiệp Rockstar? –

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