2015-06-20 3 views
1

Я пытаюсь создать простую связь has_many между моделями Game и DLC. Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку таблица DLC отсутствует из-за наследования одиночной таблицы, нет способа вставить game_id. Так что, если бы я сделать следующее я получаю эту ошибку:Использование ассоциации has_many с одной моделью наследования таблицы в rails

game = Game.create 
game.dlcs 

SQLite3::SQLException: no such column: games.game_id 

Вот как мои модели в настоящее время установки:

class Game < ActiveRecord::Base 
    has_many :dlcs 
end 

class DLC < Game 
    belongs_to :game 
end 

Примечание: DLC относится к downloadable content

+0

Почему это полиморфно? – Swards

+0

Если честно, я не совсем уверен в этом. Я просто пытался все, что видел в предыдущем ответе. –

+0

Вы читали руководство Rails по ассоциациям? http://guides.rubyonrails.org/association_basics.html – 7stud

ответ

2

Простейшей альтернативой было бы просто использовать самосоединения и добавить столбец parent_id в games.

class Game < ActiveRecord::Base 
    has_many :dlcs unless self.name == 'DLC' 
end 

class DLC < Game 
    belongs_to :game, foreign_key: :parent_id 
end 

Если это абсолютно немыслимо, вы можете создать таблицу соединений.

# game_id: int 
# dlc_id: int 
class GameExtension 
    belongs_to :game 
    belongs_to :dlc 
end 

class Game < ActiveRecord::Base 
    has_many :game_extensions 
    has_many :dlcs, though: :GameExtension 
end 

class DLC < Game 
    has_many :game_extensions 
    belongs_to :game, though: :GameExtension 
end 
2

Редактировать:Этот ответ был основан на непонимании исходного вопроса. ОП разъяснил, что Download относится к DLC, и на самом деле является приличным случаем для ИППП.

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

Гипотетические модели, называемые Cow и Horse, могут делиться таблицей farm_animals. Вы могли бы даже сделать Stallion подклассом Horse. Это позволит вам хранить все эти модели на одном столе, предоставляя вам удобство методов, таких как Stallion.new, что на самом деле является аббревиатурой от FarmAnimal.new(type: 'horse', gender: 'male').

Непонятно, что те же преимущества здесь присутствуют для отношений между Game и Download. Если я пропустил что-то важное, и я предоставляю бесполезную информацию с этим ответом, мои скромные извинения! В противном случае я бы предложил переоценить использование ИППП в этом случае.

+0

Вы знакомы с термином DLC (загружаемый контент)? Подумайте об этом как о пакете расширения для видеоигры. Так, например, игра, подобная «Bioshock», является основным названием, но затем есть расширение DLC под названием «Захоронение в море». DLC наследует все атрибуты из игры (название, достижения, box art и т. Д.). Я не был уверен, будет ли Rails правильно знать, как плюрализовать 'DLC', поэтому я назвал модель' Download'. Значит ли это сейчас? –

+0

Ah, это * делает * смысл! Позвольте мне подумать над этим и посмотреть, смогу ли я улучшить свой ответ. – rossettistone

+0

Я думаю, что maxcal прибил его в комментарии к вашему вопросу. Это отличный пример для самостоятельного присоединения, и связанные с ним документы являются правильными: http://guides.rubyonrails.org/association_basics.html#self-joins. Раньше я не встречался с STI, но я не понимаю, почему это не сработает! – rossettistone

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