簡體   English   中英

我如何建立一個has_many關聯,其中一個模型在Ruby on Rails中具有兩組jsonb id

[英]How do I set up a has_many association where one model has two sets of jsonb ids in Ruby on Rails

我希望能夠查詢用戶的user_id在游戲動作的white_user_ids或black_user_ids中的用戶的游戲。 我還希望能夠查詢游戲的用戶,其移動的white_user_ids或black_user_ids與用戶相對應。

編輯:

在開始更詳細地解釋我的問題之前,我想出了一種解決方法:

class User < ActiveRecord::Base
  def games
    Game.where( [ "moves -> 'black_user_ids' @> '?' OR moves -> 'white_user_ids' @> '?'", self.id, self.id ] )
  end
end

class Game < ActiveRecord::Base
  serialize :moves, HashSerializer
  store_accessor :moves, :white_user_ids, :black_user_ids

  def users
    User.find((self.white_user_ids + self.black_user_ids).uniq)
  end
end

用我想要的名稱創建自定義方法,而不是寫出has_many ... ,有什么問題嗎? 如果這很糟糕,請繼續閱讀並隨時回答。

最初的問題:

這是此問題的架構的最基本版本:

User
  id

Game
  id
  moves - jsonb
    white_user_ids - integer array
    black_user_ids - integer array

我已經為兩個user_ids創建了一個表達式索引:

execute <<-SQL
  CREATE INDEX moves_white_user_ids_on_games ON games USING GIN ((moves->'white_user_ids'));
  CREATE INDEX moves_black_user_ids_on_games ON games USING GIN ((moves->'black_user_ids'));
SQL

我不知道如何建立用戶與游戲之間的關系。 顯然存在某種has_many關系,甚至可能是has_and_belongs_to_many關系。 但是我將需要建立關聯的所有數據存儲在游戲表中,移動jsonb列。

例子:

<User id: 1>
<User id: 5>
<User id: 6>
<User id: 11>
<User id: 17>
<User id: 20>
<User id: 23>
<User id: 35>
<User id: 76>
<User id: 89>
<User id: 93>

<Game id: 1, moves: {"black_user_ids"=>[88],
                     "white_user_ids"=>[23]}>
<Game id: 2, moves: {"black_user_ids"=>[6, 1, 11, 76, 17, 23],
                     "white_user_ids"=>[93, 89, 1, 35, 20, 5, 6]}>
<Game id: 3, moves: {"black_user_ids"=>[76, 68, 20, 96, 19, 3],
                     "white_user_ids"=>[82, 48, 29, 37, 20, 74]}>
<Game id: 4, moves: {"black_user_ids"=>[82],
                     "white_user_ids"=>[74, 16]}>
<Game id: 5, moves: {"black_user_ids"=>[22, 41, 25, 78, 50],
                     "white_user_ids"=>[24, 10, 99, 26, 1, 4]}>

用戶關聯/范圍:

User.find(1).games將返回游戲[2,5],black_user_ids或white_user_ids具有其user_id的任何唯一游戲。

User.find(1).black_games將返回游戲[2],其中black_user_ids具有其user_id的任何游戲。

User.find(1).white_games將返回游戲[2,5],其中white_user_ids具有其user_id的任何游戲。

游戲關聯/范圍:

Game.find(2).users將返回用戶[ Game.find(2).users ],black_user_ids或white_user_ids中的任何唯一用戶。

Game.find(3).black_users將返回用戶[ Game.find(3).black_users ],以及其black_user_id中的任何用戶。

Game.find(4).white_users將返回用戶[ Game.find(4).white_users ],即其white_user_ids中的任何用戶。

您可以使用多態關聯進行此操作。

http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

然后,moves表將具有id並鍵入black或white。 然后,您可以將其關聯到游戲並查詢黑棋或白棋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM