2014-10-30 2 views
0

У меня есть небольшое приложение, в котором у меня есть простая пользовательская модель, и сейчас я пытаюсь добавить функциональность мягкого удаления (да, я знаю, что для этого есть некоторые драгоценности). Работает отлично для пользователей, однако, когда я удаляю пользователя, связанное представление темы сворачивается, поскольку он больше не может найти удаленного пользователя из-за используемой по умолчанию области действия. Любая идея, как это сделать?Rails soft delete with has_many association

class User < ActiveRecord::Base 
has_many :topics 
has_many :comments 
default_scope { where(active: true) } 
end 

def index 
@topics=Topic.all 
end 

class UsersController < ApplicationController 
def index 
    if current_user and current_user.role == "admin" 
    @users=User.unscoped.all 
    else 
     @users=User.all 
    end 
end 

Часть зрения (topic.user.name, где она перестает работать):

<% @topics.each do |topic| %> 
    <tr> 
    <td><%=link_to topic.title, topic %></td> 
    <td><%=h topic.description %></td> 
    <td><%= topic.user.name %></td> 
    <td><%=h topic.created_at.strftime('%Y %b %d %H:%M:%S') %></td> 
    <td><%=h topic.updated_at.strftime('%Y %b %d %H:%M:%S') %></td> 
    </tr> 
<% end %> 
+0

Я не вижу '@topics', определенный в вашем коде контроллера? Можете ли вы опубликовать этот код? – Surya

+0

Также вы хотите отобразить все темы (событие для тех пользователей, чей активный столбец установлен в false)? – Surya

+0

Добавлен список указателей контроллера, хотя это очень просто. – user3133406

ответ

0

Именно поэтому default_scope является злым. К настоящему моменту вы поняли, что наличие default_scope может привести к дикой гусиной погоне.

Вы можете изменить user.rb к этому:

class User < ActiveRecord::Base 
    has_many :topics 
    has_many :comments 
    scope :active, -> { where(active: true) } 
    scope :inactive, -> { where(active: false) } # can be used in future when you want to show a list of deleted user in a report or on admin panel. 
end 

затем контроллер:

class UsersController < ApplicationController 
    def index 
    @users = User.scoped 
    @users = @users.active if current_user && current_user.role != 'admin' 
    end 
end 

вид не будет иметь никаких проблем с вашей темы # индекс Сейчас:

<% @topics.each do |topic| %> 
    <tr> 
    <td><%=link_to topic.title, topic %></td> 
    <td><%=h topic.description %></td> 
    <td><%= topic.user.name %></td> 
    <td><%=h topic.created_at.strftime('%Y %b %d %H:%M:%S') %></td> 
    <td><%=h topic.updated_at.strftime('%Y %b %d %H:%M:%S') %></td> 
    </tr> 
<% end %> 

Всякий раз, когда вы хотите отображать активных пользователей, просто выполните: @users = User.active.

0

Используйте это, и оставить ассоциации, как это.

<td><%= topic.user.try(:name) %></td> 
+0

Это может обойти исключение довольно хорошо, однако все еще не может отобразить имя пользователя. – user3133406

+0

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