[...] Как я могу ввести новое значение, где B принадлежит A. Код, приведенный ниже, похоже, не работает.
Ваш код подразумевает, что вы после A принадлежите B, но ваш вопрос обратный, поэтому я покажу, как это сделать, то есть B принадлежит A.
class A
include DataMapper::Resource
property :id, Serial, :key => true
property :name, String
has n, :bs # A has many B's
end
class B
include DataMapper::Resource
property :id, Serial, :key => true
property :name, String
belongs_to :a, :required => false # B has only 1 A
end
Обратите внимание на то, что ваши has и own_to поменялись местами. Я также добавил required => false на сторону own_to, потому что DataMapper молча откажется сохранить вашу модель, если когда-либо не будет ba перед вызовом save - как только вам это будет удобно, вы можете удалить требуемое false, если хотите.
Вот два способа использования этой модели:
# Create new value
post '/create' do
a = A.new
a.save
b = B.new
b.attributes = params
b.a = a
b.save
redirect("/info/#{a.id}")
end
Этот пример, как правило, такой же, как ваш, но я добавил вызов сохранения для A. Примечание это может быть не нужно , я не в подходящем месте для проверки этого конкретного случая; в прошлом я обнаружил, что DataMapper будет сохранять некоторые связанные объекты автоматически, но не другие, поэтому я выработал привычку всегда сохранять явные данные явно, чтобы избежать путаницы.
# Create new value
post '/create' do
a = A.create
b = a.bs.create(params)
redirect("/info/#{a.id}")
end
Во втором примере, который я называю созданием во многих отношениях, это создает новый B, ассоциирует его с «a», устанавливает данные параметры и сразу же сохраняет его. Результат такой же, как и в предыдущем примере.
Если вы только знакомитесь с DataMapper, вам может быть полезно добавить в ваше приложение следующее:
DataMapper::Model.raise_on_save_failure = true
Это приведет к тому, что DataMapper выдаст вам ошибки и обратные следы в случаях, подобных описанным выше, подробнее здесь .