Mongoid :: Ошибки :: AmbiguousRelationhip в пользователях # показать - PullRequest
0 голосов
/ 21 января 2019

Я использую ruby ​​'2.5.0', rails, '5.2.2', mongoid '7.0.2' и devise

Я пытаюсь добавить функцию follow, но у меня есть эта ошибка в mongoid '7.0.2 '

сообщение: неоднозначные отношения

@ options = {: class_name => "Пользователь"}, @ extension = nil, @ module_path = "", @ polymorphic = false, @ default_foreign_key_field = "follower_id", @ foreign_key = "follower_id", @ indexed = false, @ class_name = "Пользователь", @ klass = Пользователь, @ validate = false>,

@ options = {: class_name=> "Пользователь"}, @ extension = nil, @ module_path = "", @ polymorphic = false, @ default_foreign_key_field = "follow_id", @ foreign_key = "follow_id", @ indexed = false, @ class_name = "User", @klass = Пользователь, @ validate = false> определено в Связи.резюме: когда Mongoid пытается установить обратный документ отношения в памяти, он должен знать, к какому отношению он принадлежит.При установке: Relations, Mongoid просматривал класс User на предмет соответствия, но были найдены кратные, которые могли бы потенциально соответствовать:

@ options = {: class_name => "Пользователь"}, @ extension = nil, @module_path = "", @ polymorphic = false, @ default_foreign_key_field = "follower_id", @ foreign_key = "follower_id", @ indexed = false, @ class_name = "Пользователь", @ klass = Пользователь, @ validate = false>,

@ options = {: class_name => "Пользователь"}, @ extension = nil, @ module_path = "", @ polymorphic = false, @ default_foreign_key_field = "follow_id", @ foreign_key = "follow_id", @ indexed = false, @ class_name = "Пользователь", @ klass = Пользователь, @ validate = false>.разрешение: В отношении: отношения на Пользователе вы должны добавить опцию: inverse_of, чтобы указать точное отношение на Отношении, противоположное отношениям:

user.rb

class User
  include Mongoid::Document

  field :email, type: String, default: ""

  has_many :relationships, foreign_key: "follower_id", dependent: :destroy
  has_many :reverse_relationships, foreign_key: "followed_id", class_name: "Relationship", dependent: :destroy

  def retrieve_users_for_ids(user_ids)
    users = []
    User.in(id: user_ids).each do |user|
      users << user
    end

    users
  end

  def followed_users
    user_ids = []
    relationships.each do |relationship|
      user_ids << relationship.followed_id
    end

    return retrieve_users_for_ids(user_ids)
  end

  def followers
    user_ids = []
    reverse_relationships.each do |relationship|
      user_ids << relationship.follower_id
    end

    return retrieve_users_for_ids(user_ids)
  end

  def following?(other_user)
    relationships.where(followed_id: other_user.id).first
  end

  def follow!(other_user)
    relationships.create!(followed_id: other_user.id)
  end

  def unfollow!(other_user)
    relationships.where(followed_id: other_user.id).first.destroy
  end
end

_follow.html.erb

<%= form_for(current_user.relationships.build(followed_id: @user.id),
             remote: true) do |f| %>
  <%= f.hidden_field :followed_id %>
  <%= f.submit 'Follow', data: {disable_with: 'Follow...'}, class: 'btn btn-d' %>
<% end %>

1 Ответ

0 голосов
/ 22 января 2019

Нашел рабочее решение

user.rb

class User
  include Mongoid::Document

  has_and_belongs_to_many :following, class_name: 'User', inverse_of: :followers
  has_and_belongs_to_many :followers, class_name: 'User', inverse_of: :following

  def follow(other_user)
    self.following << other_user
    other_user.followers << self
  end

  def unfollow(other_user)
    self.following.delete(other_user)
    other_user.followers.delete(self)
  end

  def following?(other_user)
    self.following.include?(other_user)
  end
end

users_controller.rb

class UsersController < ApplicationController
  def following
    @title = 'Following'
    @user = User.find(params[:id])
    @users = @user.following.page(params[:page])
    render 'show_follow'
  end

  def followers
    @title = 'Followers'
    @user = User.find(params[:id])
    @users = @user.followers.page(params[:page])
    render 'show_follow'
  end
end

relations_controller.rb

class RelationshipsController < ApplicationController
  def create
    @user = User.find(params[:user_id])
    current_user.follow(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end

  def destroy
    @user = User.find(params[:user_id])
    current_user.unfollow(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end
end

маршруты.rb

Rails.application.routes.draw do
  resources :users do
    member do
      get :following, :followers
    end
  end

  post   '/follow/',  to: 'relationships#create'
  delete '/unfollow', to: 'relationships#destroy'
end

представления / отношения / create.js.erb

$("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>")
$("#followers").html('<%= @user.followers.count %>')

представления / отношения / destroy.js.erb

$("#follow_form").html("<%= escape_javascript(render('users/follow')) %>")
$("#followers").html('<%= @user.followers.count %>')

просмотров / пользователей/_follow_form.html.erb

<% unless current_user?(@user) %>
  <div id="follow_form">
  <% if current_user.following?(@user) %>
    <%= render 'unfollow' %>
  <% else %>
    <%= render 'follow' %>
  <% end %>
  </div>
<% end %>

views / users / _follow.html.erb

<%= form_tag "/follow", method: :post , remote: true do %>
  <%= hidden_field_tag :user_id, @user.id %>
  <%= submit_tag "Follow", data: {disable_with: 'Follow...'}, class: "btn btn-d" %>
<% end %>

views / users / _unfollow.html.erb

<%= form_tag "/unfollow", method: :delete , remote: true do %>
  <div><%= hidden_field_tag :user_id, @user.id %></div>
  <%= submit_tag "Unfollow", data: {disable_with: 'Unfollow...'}, class: "btn btn-d" %>
<% end %>

views / users / show.html.erb

<% if current_user == @user %>
  <%= render 'follow_form' %>
<% end %>
...