Rails 3.1: почему обе переменные обновляются, когда я обновляю только одну - PullRequest
1 голос
/ 28 февраля 2012

Извините, если это название не имеет смысла, я новичок в Rails и создаю игру в покер, чтобы изучить фреймворк.У меня есть модель Game ...

class Game < ActiveRecord::Base

    has_many :players, :dependent => :destroy
    has_many :community_cards, :class_name => "Card", :dependent => :destroy
    has_many :used_cards, :class_name => "Card", :dependent => :destroy

... с несколькими ассоциациями для игроков, community_cards и used_cards.Тем не менее, когда я добавляю объекты карточек в used_cards ...

new_card = Card.create(:suit => random_suit, :face => random_face)
used_cards << new_card 

..., тогда community_cards обновляются теми же карточками, так что и used_cards, и community_cards содержат одинаковые объекты.Что дает?

Большое спасибо заранее за всю вашу мудрость!

1 Ответ

2 голосов
/ 28 февраля 2012

Поскольку модель Card хранит одно поле game_id, и эта новая карта затем устанавливается в качестве дочернего объекта игрового объекта, оба массива обновляются.У Rails нет возможности узнать, что к чему.Однако, есть решение.

Если вы посмотрите документацию has_many на api.rubyonrails.org, вы увидите, что есть опция условий.Поэтому я предлагаю добавить логическое поле в модель карты.Затем добавьте условие в каждое из ваших объявлений has_many для модели Card, чтобы проверить соответствие логическому значению.Например,

rails g migration add_used_to_cards used:boolean

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

 add_column :cards, :used, :boolean, :default => false

Затем измените has_many следующим образом:

has_many :community_cards, :class_name => "Card", :dependent => :destroy, :conditions => { :used => false }
has_many :used_cards, :class_name => "Card", :dependent => :destroy, :conditions => { :used => true }

Это должно помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...