1

Я хочу создать полиморфную систему дружбы/сети.Rails: Как создать полиморфные отношения/модель дружбы

Например

Пользователь может запросить или быть запрашивающей объединить несколько моделей, как:

  • компании
  • проекта
  • Группа
  • Контакты (друзей)

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

Других многие ко многим например пользователь имеет много проектов, проект имеет много пользователей

Отношений являются не трудно создать с помощью активного записываются. Средний шаг, запрашивающий (приглашения), который меня озадачил.

После того, как я обрушился, это то, с чем я столкнулся.

Приведенный ниже пример позволяет мне делать запросы от профиля (пользователя) на несколько моделей полиморфно (это даже слово?), В том числе сама модель профиля.

Это образец того, как Контроллер может работать.

@company = Company.find(params[:id]) 
@request = @company.requests.create!(status: "pending").build_profile 
@request.profile = current_user 

Как я мог сделать @company более динамичным, скажем, если он где профиль (пользователь) с просьбой присоединиться к проекту или профиль (пользователь) просит друзей с другим профилем (пользователя)?

Так что я решил эту небольшую проблему, я думаю, со следующим кодом в моем контроллере.

requests_controller.rb

class RequestsController < ApplicationController 
    before_filter :load_requestable 

    def new 
    @request = @requestable.requests.new 
    end 

    def create 
    @request = @requestable.requests.new(params[:status]) 
    if @request.save 
    redirect_to @requestable, notice: "Request sent." 
    else 
    render :new 
    end 
end 

private 

def load_resquestable 
    resource, id = requests.path.split('/')[1, 2] 
    @requestable = resource.singularize.classify.constantize.find(id) 
end 

[точка слипания] Теперь я пытаюсь получить кнопку запроса на мой взгляд, происходит и я получаю следующую ошибку

undefined method `requests_path' for #<#<Class:0x007fe8b26667f8>:0x007fe8b26f40d0> 

извлеченного источник (около линии № 1):

1: <%= form_for [@requestsable, @request] do |f| %> 
2: <div class="field"> 
3:  <%= f.text_area :content, rows: 8 %> 
4: </div> 

Вот код для представлений

компании/show.html.erb

<%= @company.name %> 
<% render 'requests/form' %> 

запросов/_form.html.erb

<%= form_for [@requestsable, @request] do |f| %> 
    <div class="field"> 
    <%= f.text_area :content, rows: 8 %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

_ модели

профиль ,гь

class Profile < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :company 
    has_many :requests 
    has_many :requested, as: :requestable 

    attr_accessible :first_name, :last_name 


    validates :first_name, presence: true 
    validates :last_name, presence: true 

end 

request.rb

class Request < ActiveRecord::Base 

    attr_accessible :status 
    belongs_to :requestable , polymorphic: true 
    belongs_to :profile 

end 

company.rb

class Company < ActiveRecord::Base 
    has_many :employees, 
    :foreign_key => 'company_id', 
    :class_name => "Profile" 

    has_many :requests, as: :requestable 


    attr_accessible :name 
    validates :name, presence: true, length: { maximum: 50 }, uniqueness: true 

end 

ответ

1

Я думаю, что это не модель пользователя, который должен быть полиморфными.

Что вы можете сделать, это ввести еще одну модель UserRequest, которая будет объединяться в ассоциации от User до UserRequest.

Тогда вы можете сделать следующее:

class User < ActiveRecord::Base 
    has_many :user_requests 
    has_many :project_users 
    has_many :projects, :through => :project_users 
    has_many :group_users 
    has_many :groups, :through => group_users 
    has_many :contact_users 
    has_many :contacts, :through => :contact_users 
    belongs_to :company 
end 

И RequestUser mdoel может постоянно отслеживать, какие объекты есть Запрошенный, также RequestUser модели будет иметь полиморфные ассоциации с Project, Company пользователя, Group и Contact моделей.

Таким образом, вы всегда можете контролировать, какой пользователь имеет запрос для какой-либо конкретной сущности, а также облегчит выполнение вычислений.

Надейтесь, что эта архитектура работает для вас. Дайте мне знать, если вам нужна дополнительная помощь.

EDIT:

Вы также можете реализовать механизм изменения состояния в RequestUser модели для проверки статуса запроса, отправляемого пользователем.

+0

У меня были похожие, но я чувствую, что факт, что повторное использование model_users это не очень СУХОЙ. –

+0

Вы можете удалить эти модели, используя ассоциацию 'has_and_belongs_to_many'. Но лично я чувствую, что ассоциация объединения (has_many through) между ними дает вам лучший контроль над соответствующими моделями. Вы можете сослаться на эту ссылку здесь http://stackoverflow.com/questions/2780798/has-and-belongs-to-many-vs-has-many-through для получения более подробной информации – Rohit

Смежные вопросы