Соединяется в рельсах между тремя столами - PullRequest
0 голосов
/ 12 июня 2018

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

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 ]

0 голосов
/ 12 июня 2018

если вам нужен доступ к средствам от родителя, вы можете использовать has_many с объявлением в рельсах следующим образом:

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

добавление в счет.1017 *

0 голосов
/ 12 июня 2018

Здесь вам не нужны соединяемые таблицы - скорее столбец родительского идентификатора в дочерней записи.Итак, в вашем случае:

  • Child нужен целочисленный столбец parent_id
  • Funding нужен целочисленный столбец child_id

Объединение таблиц вступает в игру только тогда, когда вы реализуете отношения has_and_belongs_to_many или has_many through.

Если вы думаете о том, как вы связываете записи, чтобы ребенок принадлежал родителю, ребенок простоему нужно знать, к какому родителю он привязан, отсюда и столбец.

Теперь представьте, что у родителей было много детей, у детей было много родителей: идентификатор одного родителя не уменьшал бы его, поэтому объединяющая таблица вступает в связьдва вместе, содержащие (например) оба parent_id и child_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 %>

Это немного грязно, поэтому стоило бы разделить данные в контроллере или партиалы в соответствии с требованиями.Надеюсь, это даст вам представление о том, как это сделать?

...