Соединяется в рельсах между тремя столами
У меня три стола родителей, детей и пожертвований.
parent.rb
class Parent < ApplicationRecord
has_many :children, dependent: :destroy
end
child.rb
class Parent < ApplicationRecord
belongs_to :parent
has_many :fundings, dependent: :destroy
end
funding.rb
class Funding < ApplicationRecord
belongs_to :child
end
Соединения между детьми и фондами
create_table "children_fundings", id: false, force: :cascade do |t|
t.integer "child_id", null: false
t.integer "funding_id", null: false
t.index ["child_id", "funding_id"], name:
"index_children_fundings_on_child_id_and_funding_id"
t.index ["funding_id", "child_id"], name:
"index_children_fundings_on_funding_id_and_child_id"
end
объединить детей и родителей
create_table "children_parents", id: false, force: :cascade do |t|
t.integer "parent_id", null: false
t.integer "child_id", null: false
t.index ["child_id", "parent_id"], name:
"index_children_parents_on_child_id_and_parent_id"
t.index ["parent_id", "child_id"], name:
"index_children_parents_on_parent_id_and_child_id"
end
у дочерней таблицы есть parent_id, у таблицы с финансами есть child_id. Как я могу создать соединение между родителями детей и таблицей средств. Пожалуйста помоги
2 ответа
Здесь вам не нужны соединительные таблицы - скорее столбец родительского идентификатора в дочерней записи. Итак, в вашем случае:
Child
нужен целочисленный столбецparent_id
Funding
нужен целочисленный столбецchild_id
Столы объединения вступают в игру только тогда, когда вы реализуете has_and_belongs_to_many
или же has_many through
отношения.
Если вы думаете о том, как вы связываете записи, чтобы ребенок принадлежал родителю, ребенку просто нужно знать, к какому родителю он привязан, и, следовательно, столбец.
Теперь представьте, что у родителей было много детей, у детей было много родителей: идентификация одного родителя не сократила бы его, поэтому объединяющая таблица входит, чтобы связать их вместе, включая (например) оба parent_id
а также child_id
в каждой строке данных.
База данных связывает записи вместе, используя эти методы, запрашивая id или таблицу соединений по мере необходимости.
Чтобы получить доступ к фондам из родительской записи, вы можете либо связать их вместе, если они независимо связаны, либо получить доступ через детей, если нет.
Для последнего вы можете использовать что-то вроде следующего.
В вашем контроллере:
@parents = Parent.includes(children: :fundings) # includes preloads the data, avoiding expensive N + 1 queries
По вашему мнению:
<% @parents.each do |parent| %>
<#% whatever you want to display regarding the parent here %>
<% parent.children.each do |child| %>
<#% whatever you want to display regarding the child here %>
<% child.fundings.each do |funding| %>
<#% whatever you want to display regarding the funding here %>
<% end %>
<% end %>
<% end %>
Это немного грязно, так что стоило бы разделить данные в контроллере или частичные части как подходящие. Надеюсь, что это дает вам представление о том, как это работает?
Если вам нужен доступ к средствам от родителя, вы можете использовать has_many с объявлением в rails следующим образом:
parent.rb
class Parent < ApplicationRecord
has_many :children, dependent: :destroy
has_many :fundings, through: :children
end
child.rb
class Child < ApplicationRecord
belongs_to :parent
has_many :fundings, dependent: :destroy
end
funding.rb
class Funding < ApplicationRecord
belongs_to :child
end
Вы можете получить доступ к записи о финансировании через родителя с @parent.fundings
вот ссылка ссылка для has_many через