【发布时间】:2012-02-17 11:45:09
【问题描述】:
我有一个页面,用户可以在其中查看当前线程对话中的消息列表。
他们可以使用删除链接(每条消息的每个循环内的链接)删除每条消息:
<%= 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 个属性,它会将所有属性(发件人/收件人状态)更新为 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)。
要获取 convo 中的其他消息,我只需键入 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 消息路径的参数。
【问题讨论】:
-
我猜应该有一个与当前对话线程相关的实体,例如
conversation记录。如果是,则传递对话记录 ID,找出该对话的所有消息以删除。 -
在我的帖子中添加了更多信息
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 rubygems