Самореференциальные отношения для записи только создадут отношения с самим собой - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь создать метод, с помощью которого пользователь может прикреплять связанные записи к существующим записям, аналогично тому, как пользователь может следовать за другими пользователями. Однако при вызове метода связь может быть установлена ​​только между записью и самой собой. Я основал свой код на последователе / ​​следующей модели, и я считаю, что проблема возникает из-за того, что метод не может различить текущую запись и запись, выбранную для создания отношения. Есть идеи, как это можно решить? Соответствующий код ниже ...

Модель

    class Ingref < ApplicationRecord
        has_many :active_relationships, class_name: "Ingrelationship",
                                    foreign_key: "child_id",
                                    dependent: :destroy
    has_many :passive_relationships, class_name: "Ingrelationship",
                                     foreign_key: "parent_id",
                                     dependent: :destroy
    has_many :children, through: :active_relationships, source: :parent
    has_many :parents, through: :passive_relationships, source: :child

    # Follows a user.
    def follow(other_ingref)
        children << other_ingref
    end

    # Unfollows a user.
    def unfollow(other_ingref)
        children.delete(other_ingref)
    end

    # Returns true if the current user is following the other user.
    def following?(other_ingref)
        children.include?(other_ingref)
    end

end 

Контроллер Отношений

class IngrelationshipsController < ApplicationController
    before_action :set_search

    def create
        ingref = Ingref.find(params[:parent_id])
        ingref.follow(ingref)
        redirect_to ingref
    end

    def destroy
        ingref = Ingrelationship.find(params[:id]).parent
        @ingref.unfollow(ingref)
        redirect_to ingref
    end
end

Модель отношений

class Ingrelationship < ApplicationRecord
    belongs_to :child, class_name: "Ingref"
    belongs_to :parent, class_name: "Ingref"
end

Форма

<% Ingref.find_each do |ingref| %>

        <div class="col-md-2">
              <div class="caption">
                <h3 class="title" style="font-size: 14px;"> <%= ingref.name %> </h3>
                    <%= form_for(@ingref.active_relationships.build) do |f| %>
                        <div><%= hidden_field_tag :parent_id, ingref.id %></div>
                        <%= f.submit "Follow" %>
                    <% end %>
              </div>
            </div>
          <% end %>

1 Ответ

0 голосов
/ 14 мая 2019

Я обнаружил, что проблема, описанная выше, возникла из-за того, что ребенок не определен в отношениях ребенок-родитель между двумя записями в самореференциальных отношениях.добавив следующие строки в форму и контроллер соответственно, я смог определить эту переменную и создать нужные отношения.

Форма

<%= hidden_field_tag :child_id, @ingref.id %>

Контроллер

current_ingref = Ingref.find(params[:child_id])
...