Я хочу создать полиморфную систему дружбы/сети.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
У меня были похожие, но я чувствую, что факт, что повторное использование model_users это не очень СУХОЙ. –
Вы можете удалить эти модели, используя ассоциацию 'has_and_belongs_to_many'. Но лично я чувствую, что ассоциация объединения (has_many through) между ними дает вам лучший контроль над соответствующими моделями. Вы можете сослаться на эту ссылку здесь http://stackoverflow.com/questions/2780798/has-and-belongs-to-many-vs-has-many-through для получения более подробной информации – Rohit