Ваша модель выглядит немного смущенной:
Допустим, у меня есть фруктовый сад, полный яблонь.У каждого дерева много яблок.В каждом яблоке много семян.Поэтому у каждого дерева есть много семян через яблоки.
Таким образом, у дерева есть много яблок, яблоко принадлежит к дереву и имеет много семян, а семя принадлежит яблоку (и, в конечном счете, одному дереву).).
Мы можем почти (но не совсем) принять этот язык как есть и использовать его для создания ассоциаций.После небольшого перевода, чтобы получить правильный синтаксис, мы получаем следующее:
# Trees in the orchard.
class Tree
include DataMapper::Resource
property :id, Serial
has n, :apples # "a tree has many apples"
has n, :seeds, :through => :apples
end
# Apples on a Tree.
class Apple
include DataMapper::Resource
property :id, Serial
belongs_to :tree # "an apple belongs to a tree..."
has n, :seeds # "...and has many seeds"
end
# Seeds in an Apple
class Seed
include DataMapper::Resource
property :id, Serial
belongs_to :apple # "and a seed belongs to an apple"
end
В вашем коде у вас есть семена с несколькими яблоками и деревьями, что на самом деле не имеет никакого смысла.
Какдля запросов:
Но сколько яблок есть у Tree # 2?
Предполагая, что вы имеете в виду Tree
с id == 2
:
tree_2 = Tree.get(2)
apples_of_tree_2 = tree_2.apples # this gives an array of apples
count_of_apples_of_tree_2 = tree_2.apples.count
Сколько семян у дерева # 4?
Ассоциация, которую мы добавили к Tree
модели has n, :seeds, :through => :apples
, означает, что у нас есть seeds
метод, доступный в Tree
объектах.
Tree.get(4).seeds.count
Сколько всего яблок?Сколько всего семян?
Просто:
Apple.count # note singular not plural (it's a class method on Apple)
Seed.count
Попробуйте загрузить эту новую модель в irb (вам может понадобиться удалить файл orchard.db
при изменении модели)и затем поиграем с некоторыми из запросов и методов создания , надеюсь, это даст вам лучшее представление о том, что происходит.
Создание ассоциаций
(См. Раздел «Добавление к ассоциациям» на странице связей .)
Чтобы добавить существующий Apple
в Tree
:
a_tree.apples << an_apple
Обратите внимание, что Tree
связан не с одним Apple
, а с коллекцией (это has n
Apples
), поэтому созданный метод - apples
(т.е. он является множественным числом), и метода нетapple
, поэтому вы видите ошибку no method.
Вы также можете создать новый Apple
, связанный с Tree
напрямую:
a_tree.apples.new #created but not saved to database
a_tree.apples.create #created and saved to database
Вы также можетесоздайте ассоциацию наоборот, со стороны Apple
:
an_other_apple = Apple.new
an_other_apple.tree = a_tree
, но вы должны быть осторожны, делая это таким образом,s новое яблоко не будет отображаться в коллекции a_tree
с Apples
(a_tree.apples
не включает an_other_apple
).Для того, чтобы он появился, вам нужно сохранить яблоко, а затем позвонить reload
на Tree
:
an_other_apple.save
a_tree.reload
Вам нужно остерегаться этого, так как вы можете получить Apple
, который, кажется, находится в двух Tree
с одновременно, если вы не будете осторожны.