Ruby on Rails - имеет один и принадлежит многим отношениям - PullRequest
1 голос
/ 27 июля 2010

Этот вопрос относится к ruby ​​on rails ассоциациям ActiveRecord и как генерировать эти миграции.

Я пытаюсь создать веб-приложение для системы управления документацией / данными, и у меня есть две модели - Arg и Descriptor. (Причина для того, чтобы сделать дескриптор объектом, а не атрибутом, состоит в том, что несколько аргументов имеют одно и то же описание). Связь между Args и Descriptors следующая: Arg имеет ТОЛЬКО один дескриптор. Дескриптор имеет много аргументов.

В основном, в коде я хотел бы иметь возможность сделать следующее:

a1 = Arg.first
a1.descriptor = Descriptor.first
d1 = Descriptor.last
d1.args << Arg.last
d1.args << Arg.first

В настоящее время у меня есть эта настройка:

class Descriptor < ActiveRecord::Base
  has_and_belongs_to_many :args
end

class Arg < ActiveRecord::Base
  has_one :descriptor
end

Я также провел следующие миграции:

create_table :args do |t|
  t.string :name
  t.timestamps
end

create_table :descriptors do |t|
  t.string :name
  ...
  t.timestamps
end

add_column :descriptors, :switch_id, :integer

create_table :args_descriptors, :id => false do |t|
  t.column :arg_id, :integer, :null => false
  t.column :descriptor_id, :integer, :null => false
end

Когда я пробую все вышеперечисленное, по какой-то причине я не могу получить два Args для совместного использования объекта Descriptor. например:

>> Arg.first.descriptor
=> nil
>> Arg.first.descriptor = Descriptor.last
=> #<Descriptor id: 9, name: "....
>> Arg.last.descriptor
=> nil
>> Arg.last.descriptor = Descriptor.last
=> #<Descriptor id: 9, name: "....
>> Arg.first.descriptor
=> nil

Почему первый дескриптор Арга сейчас равен нулю ?? мне не хватает столбца в моей базе данных? я не правильно определяю отношения?

Я не очень хорошо разбираюсь в рельсах и миграции / базах данных. Если вы объясняете концепцию, пожалуйста, попробуйте предоставить как примеры кода ActiveRecord, так и примеры кода миграции. Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 июля 2010

Я считаю, что вам нужны ассоциации и миграции:

class Descriptor < ActiveRecord::Base
  has_many :args
end

class Arg < ActiveRecord::Base
  belongs_to :descriptor
end

create_table :args do |t| 
  t.string  :name 
  t.integer :descriptor_id
  t.timestamps 
end 

create_table :descriptors do |t| 
  t.string :name 
  ... 
  t.timestamps 
end 

Обратите внимание, что если вы хотите сохранить дополнительную информацию относительно связи между Arg и Descriptor, то вам понадобится модель соединения, которую вы получите, используя has_many :through association.

0 голосов
/ 27 июля 2010

Вы на самом деле захотите промежуточную таблицу между этими двумя объектами.В мире баз данных это называется таблицей отображения.В Ruby вы хотите использовать has_many через ассоциацию.

http://railscasts.com/episodes/47-two-many-to-many

Обновлено с улучшенной статьей, объясняющей концепцию.

...