Ruby on Rails - имеет один и принадлежит многим отношения

Этот вопрос связан с рубином на направляющих ассоциации 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, а также примеры кода Миграций.Спасибо.

1
задан dzt 27 July 2010 в 01:44
поделиться

2 ответа

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

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 :через ассоциацию.

2
ответ дан 2 September 2019 в 22:43
поделиться

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

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

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

0
ответ дан 2 September 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: