2015-06-30 2 views
0

У меня есть 2 таблицы (TableA и TableB). A has_many Bs.has_many association не добавляет столбец в таблицу

На Rails консоли, то вторая строка этого фрагмента кода не работает:

@a = TableA.new 
@a.TableBs 

Я получаю эту ошибку: PG :: UndefinedColumn: ОШИБКА: ... не существует

Спасибо за вашу помощь

+2

Пожалуйста, представьте код для ваших моделей для 'TableA' и' TableB'. Также обратите внимание, что 'TableBs' * не * атрибут или метод' TableA', если 'table_a'' has_many: table_bs'. Вам необходимо прочитать документацию Rails относительно [активных ассоциаций записей] (http://guides.rubyonrails.org/association_basics.html). Попробуйте '@ a.table_bs'. – lurker

+1

Ни один из макросов связей рельсов (has_one, has_many и т. Д.) Не добавляет столбцы в db. Вы должны добавить их сами, создав миграцию и выполнив команду 'rake db: migrate'. http://guides.rubyonrails.org/active_record_migrations.html – max

ответ

0

Это потому, что у вас нет правильно настроенных таблиц, и вы запрашиваете класс.

Настройте свои ассоциации, как это:

class TableA < ActiveRecord::Base 
    has_many :table_bs, inverse_of: :table_a, dependent: :destroy 
end 

class TableB < ActiveRecord::Base 
    belongs_to :table_a, inverse_of: :table_bs 
end 

Ваши соответствующие миграции должны выглядеть следующим образом:

rails g migration create_table_as name:string

rails g migration create_table_bs name:string table_a:references

rake db:migrate

Ваша таблица TableB теперь будет иметь на ней table_a_id, где ассоциация затвердевает.

Теперь вы сможете запустить что-то подобное в вашем IRB Например:

@a = TableA.new 

@b = TableB.new 
@b.table_a = @a 
@b.save 

@a.table_bs 
=> #<ActiveRecord::Associations::CollectionProxy [#<TableB id: 1, name: "Foo"]> 

Update

Вот краткое небольшое объяснение на inverse_of и dependent: :destroy

inverse_of делает Ассоциированные объекты в Rails гораздо более эффективны. Не добавляя это в ваши ассоциации, выясняется, что связанные объекты Rails не указывают на те же объекты в памяти. Это означает, что без inverse_of вы всегда будете попадать в базу данных, чтобы Rails мог захватить ассоциации. Если вы включите его, хотя, если объект уже находится в памяти, Rails просто возьмет этот объект! Это по существу двусторонняя привязка в памяти.

dependent: :destroy используется для родительского объекта, чтобы гарантировать, что связанные объекты будут уничтожены при уничтожении родителя.

+0

Не могли бы объяснить, что делать ** inverse_of: ** и ** depend: ** mean? –

+1

Я обновил свой ответ для вас! –

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