![](/img/trans.png)
[英]How do I do a has_many through association on a has_many through association in rails?
[英]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.