Соединяется в рельсах между тремя столами

У меня три стола родителей, детей и пожертвований.

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 через

Другие вопросы по тегам