9

Trong ứng dụng đường ray của tôi, tôi có hai mô hình liên quan đến has_and_belongs_to_many. Điều này có nghĩa là có một bảng tham gia.Sắp xếp các liên kết has_and_belongs_to_many

Hãy tưởng tượng kịch bản mà tôi đang thêm người dùng vào trò chơi. Nếu tôi muốn thêm người dùng, tôi thực hiện:

@game.users << @user 

Giả sử tôi muốn biết thứ tự tôi đã thêm những người dùng này theo thứ tự nào. Tôi có thể làm điều này:

@game.users.each do.... 

Câu hỏi của tôi là:

  1. là thứ tự nếu danh sách này đảm bảo để đọc theo cùng một cách mỗi lần?

  2. Nếu đúng như vậy, Cách sạch sẽ để sắp xếp lại người dùng trong trò chơi là gì?

Trả lời

18

Mở rộng trên dưới cùng của câu trả lời danivo của:

Nếu bạn muốn đặt hàng vào thời điểm chúng được bổ sung vào danh sách này sau đó tôi khuyên thay vì sử dụng một has_and_belongs_to_many bạn thực sự sử dụng một has_many :through:

game.rb

has_many :played_games 
has_many :users, :through => :played_games, :order => "played_games.created_at ASC" 

user.rb

has_many :played_games 
has_many :games, :through => :played_games 

played_game.rb

belongs_to :game 
belongs_to :user 

Tất nhiên, thay đổi đang chờ vào tên ...

Trong played_games bảng nếu bạn có một cột gọi là created_at thứ hai has_many trong các trò chơi sẽ đặt hàng theo trường này và trả lại người dùng theo thứ tự mà họ đã được thêm vào trò chơi.

+0

Tôi nghĩ rằng điều này có thể làm việc cho tôi ... để cung cấp thêm ngữ cảnh - Tôi không cần sắp xếp theo tên người dùng, thay vào đó tôi muốn máy chủ chọn ngẫu nhiên một đơn đặt hàng để các vị trí của người chơi trong trò chơi được quyết định. Vì vậy, tôi đoán tôi có thể đặt một trường 'player_index' trong bảng play_game, và cung cấp các chỉ số tại thời điểm tôi muốn quyết định người di chuyển đầu tiên .... – cmaughan

11

Tôi không chắc chắn nhưng tôi sẽ nói rằng thứ tự là như đảm bảo để được giống như cơ sở dữ liệu của bạn đảm bảo thứ tự của các tập kết quả mà không có một trật tự quy định tại khoản.

Bạn có thể thêm :order => "last_name, first_name asc" vào báo cáo mối quan hệ :has_and_belongs_to_many. Điều này sẽ đặt hành vi mặc định cho thứ tự của các mục quay lại.

Bạn cũng có thể làm @game.users.find(:all, :order => "last_name, first_name asc") hoặc tạo các phạm vi được đặt tên theo thứ tự chung mà bạn sẽ cần. Check out the api for details

Nếu biết thứ tự bạn đã thêm chúng thực sự quan trọng, bạn có thể muốn chuyển sang mối quan hệ has_many :through để bảng tham gia có thực thể riêng. Sau đó, bạn sẽ có dấu thời gian created_onupdated_on cho mối quan hệ được quản lý bởi đường ray.

+0

Chuẩn SQL rõ ràng không nói gì về thứ tự.Nó thường là thứ tự sáng tạo vì đó là cách ghi nhận được khi các bộ kết quả đang được lắp ráp, nhưng đó chỉ là một sự trùng hợp ngẫu nhiên. Một cơ sở dữ liệu có rất nhiều bản cập nhật có thể có bản ghi trên toàn bộ địa điểm. Đặt hàng người dùng nếu nó quan trọng. Tôi đã bị đốt cháy trong Rails với #last trở lại những thứ khác nhau cho postgres. – Ghoti

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