Ruby on Rails: несколько директив acts_as_list для одной и той же пары родитель-потомок - PullRequest
0 голосов
/ 15 января 2010

Я разрабатываю сервер карточной игры, для игры, в которой у каждого игрока есть колода и колода сброса. Чтобы отразить тот факт, что данная карта может быть помещена в колоду игрока или в его колоду сброса, моя модель игрока настроена следующим образом:

class Player < ActiveRecord::Base
  belongs_to :game

  has_many :deck_cards, :class_name => "Card",
                        :conditions => "location = 'deck'",
                        :order => "position",
                        :dependent => :delete_all

  has_many :discard_cards, :class_name => "Card",
                           :conditions => "location = 'discard'",
                           :order => "position",
                           :dependent => :delete_all
end

Можно ли определить мою модель Card таким образом, чтобы она могла быть acts_as_list с каждой картой в одном списке (либо колода, либо сброс для одного игрока)?

1 Ответ

1 голос
/ 15 января 2010

Ваша проблема не в проверках, а в том, что act_as_list не разрешит больше, чем список за одно отношение принадлежат.

Эта следующая проверка будет гарантировать, что карта находится в списке сброса или в колоде игрока, но не в обоих.

validates_uniqueness_of [:fields, :that, :uniquely, :describe, :a, :card],
  :scope => [:player_id, :location]

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

class Card < ActiveRecord::Base
  belongs_to :player
  validates_uniqueness_of [:fields, :that, :uniquely, :describe, :a, :card],
    :scope => [:player_id, :location]
  set_inheritance_column :location
end

class DeckCard < Card
  acts_as_list, :scope => :player
end

class DiscardCard < Card
  acts_as_list, :scope => :player
end

class Player
  belongs_to :game
  has_many :deck_cards, :order => "position",
                        :dependent => :delete_all

  has_many :discard_cards, :order => "position",
                           :dependent => :delete_all
end
...