2015-05-26 2 views
0

Я новичок в Ruby on Rails, и я работаю над простым приложением для игры в шахматы, и у меня возникают некоторые проблемы с пониманием того, как использовать несколько ассоциаций и has_many, посредством ассоциации между моим пользователем (игроком) Модели игр и пьес. Модели я планирую создать являются:RoR4 Шахматная игра Ассоциации моделей

class User < ActiveRecord::Base 
    has_many :white_games, class: :Game, foreign_key: :'white_user_id'    
    has_many :black_games, class: :Game, foreign_key: :'black_user_id' 
    has_many :pieces, through: :games, source: :games   
end 

class Game < ActiveRecord::Base 
    belongs_to :white_user, class: :User, foreign_key: :'white_user_id' 
    belongs_to :black_user, class: :User, foreign_key: :'black_user_id' 
    has_many :pieces, foreign_key: :game_id 
end 

class Piece < ActiveRecord::Base 
    belongs_to :game 
end 

Это должно использовать пользовательские внешние ключи, и связать каждую ассоциацию в качестве одного belongs_to вызова от модели игры для каждого пользователя (игрока) для игры.

Затем я распространил это на модель пользователя. В игре каждый отдельный пользователь будет иметь несколько экземпляров класса Game, потому что пользователь может быть частью нескольких игр за раз.

Итак, white_games представляет все игры, в которых игрок является частью того, где он/она является белым игроком, -> карты, принадлежащие классу sort_to white_user в игре. И black_games делают то же самое для всех игр, в которых один и тот же пользователь участвует как black_user.

Вопросы:

1) Являются ли эти ассоциации настроены правильно?

2) Для модели куска в основном я хочу просто вернуть все части, которые пользователь имеет для определенной игры за раз.

Возможно ли это с использованием «внешнего ключа» с has_many штук, а затем в пользовательской модели с указанием «источника» с has_many: штук, через:: игры?

Так что, когда я позвоню @ user.pieces (game: game.id), он сделает именно это?

ответ

0
has_many :pieces, foreign_key: :game_id 

Внешний ключ здесь не требуется, поскольку по умолчанию Rails будет искать внешний ключ, названный для класса. класс Game, поэтому по умолчанию Rails будет искать game_id с другой моделью. Лучше всего не включать вещи, которые Rails делает по умолчанию. (Внешние ключи на ваших черные/белые игры необходимы, потому что они называют что-то по-другому, чем просто <class>_id)

has_many :pieces, through: :games, source: :games 

это, вероятно, не будет работать, потому что у вас нет ассоциации набор вверх называется games - вы вместо того, чтобы имеют white_games и black_games, поэтому бит through будет искать эту связь и сказать вам, что ее не найти.

Для чего вы говорите, что вам нужны кусочки - я не думаю, что вам нужна ассоциация вообще. Вам нужны кусочки для конкретной игры пользователя? то вы просто принести в игру, а затем захватить части из этой игры

game = current_user.white_games.find(params[:id]) 
# will return all pieces for this game, both white and black 
pieces = game.pieces 

Если вы хотите только кусочки черно-пользователя ... то вам нужно будет добавить что-то различать между белым и черным например, столбец colour к классу Piece.

Тогда вы могли бы сделать что-то вроде этого:

class Piece 
    belongs_to :game 
    scope :black -> { where(colour: "black") } 
    scope :white -> { where(colour: "white") } 
end 


game = current_user.white_games.find(params[:id]) 
# will return all pieces for this game, both white and black 
pieces = game.pieces 
# just the black pieces 
black_pieces = game.pieces.black 
+0

Благодаря @taryn, что имеет смысл для меня. Единственная проблема заключается в том, что я хотел бы вернуть только белые фигуры для игры, если пользователь является white_user для игры и наоборот для black_games.Любые идеи, как бы я настроил это, используя ассоциации? – Hales

+0

Вы не можете, если не задаете цвет на куске. если вы попросите короля - как кусок знает, если это белый король или черный король? Если вы установите цвет на куске, вы также можете настроить условия для ассоциаций, которые только выберут этот цвет. Но я не уверен, что вы можете сделать это легко с помощью ассоциаций. Конечно, не так просто, как вы уже выше. Это займет некоторый сложный SQL ... который выполним. Вы хорошо разбираетесь в SQL? –

+0

Да, у меня будет цветовое поле для модели Piece. Спасибо, что помогли много! – Hales

Смежные вопросы