Этот вопрос связан с рубином на направляющих ассоциации ActiveRecord и как генерировать те миграции.
Я пытаюсь создать веб-приложение для документации/системы управления данными, и у меня есть две модели - Аргумент и Дескриптор. (Причина того, чтобы сделать дескриптор, которым состоит в том объект, а не атрибут, чтобы несколько Args совместно использовали то же описание). Отношения между Args и Descriptors следующие: Аргумент имеет ТОЛЬКО один дескриптор. Дескриптор имеет МНОГО Args.
В основном, в коде, я хотел бы смочь сделать следующее:
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 совместно использовать объект Дескриптора по некоторым причинам. например:
>> 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, а также примеры кода Миграций.Спасибо.
Я считаю, что это ассоциации и миграции, которые вам нужны:
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 :через ассоциацию
.
Вы действительно собираетесь нужна промежуточная таблица между этими двумя объектами. В мире баз данных это называется таблицей сопоставления. В Ruby вы хотите использовать has_many через ассоциацию.
http://railscasts.com/episodes/47-two-many-to-many
Обновлено с лучшей статьей, объясняющей концепцию.