на основе обсуждения в комментариях, есть несколько способов, что вопрос можно решить: прямой путь и путь Rails.
Прямой подход к созданию объектов, связанных с ними, заключается в создании объекта с использованием new_object = ClassName.new
, как это было предложено в вопросе. Затем возьмите идентификатор созданного объекта и установите его на существующий объект (непосредственно с existing_object.id = new_object.id
или с помощью какого-либо другого метода, если требуется дополнительная логика). Или установить идентификатор на новом объекте, определяя пользовательский инициализатору, такие как:
class Payment
def initializer id_of_registrant
@registrant_id = id_of_registrant
end
...
end
Преимущества такого подхода заключается в том, что она позволяет назначать регистратор идентификаторов, которые могут возникнуть из ряда объектов с различными классами, без необходимости иметь ненужное или, возможно, неправильное (для вашего решения) наследование и полиморфизм.
Путь Rails, если вы всегда имеют прямое отношение (1 к 1) между регистраторами и «обязательной» Оплата является использование has_many или belongs_to ассоциации, как описано в руководстве Rails: http://guides.rubyonrails.org/association_basics.html
для примера классов от вопроса:
class Registrant < ActiveRecord::Base
has_one :payment
end
class Payment < ActiveRecord::Base
belongs_to :registrant
end
Вы хотите использовать соответствующую миграцию для создания таблиц базы данных и внешние ключи, которые идут с этим. Например:
class CreateRegistrants < ActiveRecord::Migration
def change
create_table :registrants do |t|
t.string :name
t.timestamps
end
create_table :payments do |t|
t.integer :registrant_id
t.string :account_number
t.timestamps
end
end
end
Конечно, если вы регистранты только при необходимости произвести оплату, или сделать несколько платежей, то вам нужно будет смотреть на использовании has_many ассоциации.
С имеют и принадлежит ассоциациям, вы можете делать хорошие вещи, как:
@payment.registrant = @registrant
если вы инстанцированы объектам вручную или
@payment.new(payment_amount)
@registrant = @payment.build_registrant(:registrant_number => 123,
:registrant_name => "John Doe")
, если вы хотите ассоциации заселены автоматически.
В Rails Guide есть много примеров, хотя, по моему опыту, только попытка найти наиболее подходящую для вашего фактического варианта использования покажет, есть ли ограничения, которых нельзя было ожидать. Подход Rails упростит будущие запросы и создание объектов, но если у вас есть очень свободная модель отношений для ваших объектов, вы можете обнаружить, что она становится ограничительной или неестественной, и эквивалентные ассоциации лучше кодируются вручную с помощью ваших дополнительных бизнес-правил.
Вы имеете в виду, как передать в params [: event_id] и params [: registrant_id]? Если это так, вам нужно «def initialize event_id, registrant_id» в вашей платежной модели (или использовать хэш параметров и косвенно установить атрибуты). Или вы имеете в виду что-то еще? – Phil
Неправильно ли устанавливать атрибуты id напрямую? Я могу просто добавить их в список 'attr_accessible', верно? –
Если это только столбцы в таблице, вы можете просто установить их. Вероятно, вы захотите обратить внимание на свои определения внешнего ключа. Кроме того, как упоминает RobHeaton, идентификатор может фактически не существовать как строка базы данных, поэтому, как правило, если вы собираетесь создавать такие специальные ассоциации, как это, определите сначала объект (как вы это делаете), затем используйте атрибут registeristrant.id (вместо установки непосредственно из параметра). – Phil