DataMapper - создать новое значение для реляционной БД - PullRequest
0 голосов
/ 21 февраля 2011

У меня есть реляционная БД, определенная следующим образом.Как я могу ввести новое значение, где B принадлежит A. Приведенный ниже код не работает.

Спасибо

class A
   include DataMapper::Resource

   property :id, Serial, :key => true
   property :name, String

   belongs_to :b
end

class B
   include DataMapper::Resource

   property :id, Serial, :key => true
   property :name, String

   has n, :as
end

Создать новое значение

 # Create new value
 post '/create' do
   a = A.new

   b = B.new
   b.attributes = params
   b.belongs_to = a #problem is here
   b.save

   redirect("/info/#{a.id}")
 end

Ответы [ 2 ]

3 голосов
/ 23 февраля 2011

[...] Как я могу ввести новое значение, где 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 выдаст вам ошибки и обратные следы в случаях, подобных описанным выше, подробнее здесь .

3 голосов
/ 21 февраля 2011

# assign_to - это метод модели (класса), и вы используете его для объявления отношения ManyToOne.

В вашем примере вы должны использовать метод «<<», например: </p>

b.as << a

Это добавит экземпляр «a» в коллекцию «as» и свяжет оба ресурса.

...