0

我有一个页面,用户可以在当前的线程对话中看到消息列表。在rails上一次更新多个属性

他们可以使用删除链接(每个消息的每个循环中的链接)删除每条消息:

<%= link_to 'Delete', message, :method => :delete, :confirm => "Are you sure?", :title => message.body %> <br /> 

这基本上将它们连接到我的messages_controller一个动作:

def destroy 

    @message = Message.find(params[:id]) 
    @message.update_attribute('sender_status', 1) if @message.sender_id == current_user.id 
    @message.update_attribute('recipient_status', 1) if @message.recipient_id == current_user.id 
    @message.destroy if @message.sender_status == 1 && @message.recipient_status == 1 

    flash[:success] = "Message deleted" 
    redirect_to :back 
    end 

我现在想要的是所有消息之前的一个链接(所以我不会把它放在每个块中)。该链接将被称为“全部删除”,而不是使用值1更新1属性,它会将所有属性(sender/recipient_status)更新为1,以便用户不必单击每个单独的消息删除链接。

我有点卡住如何做到这一点。我不使用复选框,而是删除链接,以便删除所有我宁愿使用链接。

任何机构都可以为我提供解决方案吗?我真的很感激它。以为我昨天晚上睡觉,并在早上有一个想法,但仍然没有想到。

亲切的问候

更新

这些消息属于交谈。我可以通过以下方式获取对话: 1)MessageThread表。这将会话中第一条消息的message_id存储为该对话中其他消息的parent_id。举个例子。

+-----+----------+---------+---------+---------+--------+---------+----------+----------+----------+ 
| id | sende... | reci... | body | pare... | status | crea... | updat... | sende... | recip... | 
+-----+----------+---------+---------+---------+--------+---------+----------+----------+----------+ 
| 220 | 4  | 1  | hi  | 220  | 0  | 2012... | 2012-... | 0  | 0  | 
| 221 | 1  | 4  | hey  | 220  | 0  | 2012... | 2012-... | 0  | 0  | 
| 222 | 4  | 1  | hi  | 220  | 0  | 2012... | 2012-... | 0  | 0  | 
| 223 | 1  | 4  | hi  | 220  | 0  | 2012... | 2012-... | 0  | 0  | 
| 232 | 1  | 4  | good | 220  | 0  | 2012... | 2012-... | 0  | 0  | 
| 233 | 4  | 1  | and ... | 220  | 0  | 2012... | 2012-... | 0  | 0  | 
| 237 | 1  | 4  | hmm  | 220  | 0  | 2012... | 2012-... | 0  | 0  | 
| 238 | 1  | 4  | yay  | 220  | 0  | 2012... | 2012-... | 0  | 0  | 
| 239 | 1  | 4  | yess | 220  | 0  | 2012... | 2012-... | 0  | 0  | 

2)我也可以通过父母id找到对话。例如m = Message.find_by_parent_id(220)。

获得在康沃其他消息我只需要输入m.children

这里是我的messagethreads表的外观:

+-----+------------+-----------+--------------+--------+---------------------+---------------------+ 
| id | message_id | sender_id | recipient_id | status | created_at   | updated_at   | 
+-----+------------+-----------+--------------+--------+---------------------+---------------------+ 
| 102 | 247  | 1   | 5   | 0  | 2012-02-16 16:18... | 2012-02-16 16:18... | 
| 101 | 246  | 1   | 3   | 0  | 2012-02-16 16:14... | 2012-02-16 16:14... | 
| 90 | 220  | 4   | 1   | 0  | 2012-02-15 14:05... | 2012-02-15 14:05... | 
| 89 | 219  | 4   | 38   | 0  | 2012-02-15 12:26... | 2012-02-15 12:26... | 
| 88 | 218  | 2   | 4   | 0  | 2012-02-14 13:41... | 2012-02-14 13:41... | 
| 87 | 210  | 1   | 2   | 0  | 2012-02-14 13:31... | 2012-02-14 13:31... | 
+-----+------------+-----------+--------------+--------+---------------------+---------------------+ 

这里是为我工作:

def destroy_all_messages 

    Message.find_by_parent_id(params[:format]).children.each do |message| 
    message.update_attribute('sender_status', 1) if message.sender_id == current_user.id 
    message.update_attribute('recipient_status', 1) if message.recipient_id == current_user.id 
    message.destroy if message.sender_status == 1 && message.recipient_status == 1 
    end 
     flash[:success] = "Messages deleted" 
    redirect_to :back 
end 

和:

<%= link_to 'Delete All', messages_delete_all_messages_path(@current_thread.message_id), :method => :delete, :confirm => "Are you sure?" %> <br /> 

这是我的工作..意见? 我注意到我不得不使用“params [:format]”来获取我传递给控制器​​中link_to消息路径的参数。

+0

我想应该有一个与当前对话线程相关的实体,例如“对话”记录。如果这样传递会话记录ID,找出要删除的会话的所有消息。 – nkm 2012-02-17 12:10:14

+0

给我的信息添加了更多信息 – LondonGuy 2012-02-17 12:17:50

回答

1

这些消息是如何分组的?他们属于对话吗?

如果它是一个会话(带有has_many:消息)您可以添加一个“删除所有消息”按钮到会话,将该会话的id发送到delete_messages操作。在此操作中,请执行以下操作:

def destroy_messages 

    Conversation.find(params[:id]).messages.each do |message| 
    message.update_attribute('sender_status', 1) if message.sender_id == current_user.id 
    message.update_attribute('recipient_status', 1) if message.recipient_id == current_user.id 
    message.destroy if message.sender_status == 1 && message.recipient_status == 1 
    end 
end 

可能需要一些适当授权的详细信息。如果没有对话模型,则在搜索要删除的消息后执行类似操作。 (或者告诉我们,正是你显示什么的一些细节,以及如何决定要显示它)

更新

这应该是一样的。如果您可以轻松获取所有消息,只需将“对话”替换为父消息即可。你的链接应该发送父消息的ID,然后运行它的所有子消息并更新其状态。应该很容易。

m = Message.find(params[:id]) 
m.children.each do |message| 
    ... as above ... 
end 

一般情况下,只需发送一个标识符(在这种情况下,家长的ID),这是不够好,以确定要删除的邮件,用它来运行查找,然后更新记录。

+0

Hi添加了一些信息给我的信息。有两种方法可以获得对话。 – LondonGuy 2012-02-17 12:19:22

+0

这帮我回答了我原来的追求谢谢。 – LondonGuy 2012-02-17 13:39:06

2

改为使用'update_attributes'方法,并将想要更新的字段作为散列传递。

+0

你能举一个例子吗? – LondonGuy 2012-02-17 12:31:43

2

Thorsten是现货。

我可以建议一个额外的清理?

Message.rb

def is_deletable?(current_user) 
    if (self.sender_status == 1 || self.sender_id == current_user.id) && 
     (self.recipient_status == 1 || self.recipient_id == current_user.id) 
    true 
    else 
    false 
    end 
end 

message_controller.rb

def destroy 
    @message = Message.find(params[:id]) 
    if @message.is_deletable?(current_user) 
    @message.destroy 
    flash[:success] = "Message deleted" 
    else 
    flash[:error] = "You dont have permission to delete this message" 
    end 
    redirect_to :back 
end 

def destroy_messages 

Message.find_by_parent_id(params[:id]).each do |message| 
    message.destroy if message.is_deletable?(current_user) 
end 
flash[:success] = "Deleted all permissible messages" 
redirect_to :back 
end 

这有添加额外的更新语句到行额外的好处,你只是要删除,所以应该把事情更快速的&效率更高。

+0

这是一个很好的清理。我只是让事情工作,然后最终会遍历我的整个项目,并清理代码..从控制器中取出事实上可能在模型中的东西。你的例子看起来非常好。 – LondonGuy 2012-02-17 13:17:19

+0

没问题:) ....投票了吗? – TomDunning 2012-02-17 13:18:57