Ruby on Rails 2 — Путаница по поводу принадлежности, has_one, has_many и т. д.

У меня есть два объекта, Vpn и Organisation

organization.rb

has_many :vpns, :foreign_key => "managed_by"

vpn.rb

belongs_to :managed_by, :class_name => "Organisation", :foreign_key => "managed_by"

Итак, в таблице vpns есть столбец managed_by, который фактически является идентификатором организации, но я не хочу называть его organisation_id, чтобы избежать путаницы.

С этим связано, в моем представлении списка я могу сделать

<%= vpn.managed_by.nil? ? '' : vpn.managed_by.name %>

Чтобы получить название организации, к которой относится поле managed_by, но если я попытаюсь обновить атрибуты, я получу ActiveRecord::AssociationTypeMismatch in VpnController#update, поэтому по какой-то причине ожидается объект, а не строка, параметры, отправленные в запросе, как и ожидалось:

{"id"=>"1",
 "authenticity_token"=>"RWu39MOqDiu8vbuAfPzyJXAP1CKIaxIFoUjwLl2pemc=",
 "commit"=>"Save",
 "vpn"=>{"id"=>"1",
 "managed_by"=>"999"}}

Чтобы ничего не упустить, managed_by в моей форме представлено как меню select с использованием collection_select:

<%= collection_select 'vpn', 'managed_by', @organisations, :id, :name, {:selected_value => @vpn.managed_by} %>

Где @organisations — это просто результат активной записи, содержащий все организации.

Если я изменю belongs_to в vpn.rb на

belongs_to :organisation, :class_name => "Organisation", :foreign_key => "managed_by"

Обновление работает нормально, но затем в представлении списка я получаю сообщение об ошибке при попытке получить название организации:

undefined method `name' for 999:Fixnum

person martincarlin87    schedule 30.01.2014    source источник
comment
спасибо, но у вас есть пример того, как я должен правильно исправить эту ассоциацию?   -  person martincarlin87    schedule 30.01.2014
comment
Я сделал свой комментарий ответом с примером. Надеюсь, поможет.   -  person Mischa    schedule 30.01.2014


Ответы (1)


То, что вы делаете, очень запутанно: у вас есть две вещи (ассоциация принадлежности и внешний ключ), которые называются managed_by. Я не думаю, что вы можете что-то сделать, чтобы заставить Rails справиться с этим. Если вы хотите сохранить столбец managed_by в своей базе данных, вам следует придумать другое имя для вашей ассоциации.

Я предлагаю вам использовать:

belongs_to :organisation, :class_name => "Organisation", :foreign_key => "managed_by" 

как вы уже пробовали. Чтобы исправить ошибку в вашем представлении, вы должны использовать это:

<%= vpn.organisation.nil? ? '' : vpn.organisation.name %>

При использовании vpn.managed_by Rails просматривает внешний ключ, который является целым числом, а не объектом Organisation.

person Mischa    schedule 30.01.2014
comment
Вы добавили :foreign_key => "managed_by" в вызов belongs_to? - person Mischa; 30.01.2014
comment
отлично, это исправило - действительно не знал, что активные отношения записей были названы, я всегда предполагал, что это просто имя таблицы и во множественном числе, если это было один ко многим и т. д. - person martincarlin87; 30.01.2014