簡體   English   中英

一次更新Rails中的ruby中的多個屬性

[英]Updating more than one attribute at one time in ruby on 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,而是將所有屬性(發件人/收件人狀態)更新為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消息路徑中的參數。

請改用'update_attributes'方法,並將要更新的字段作為哈希值傳遞。

托爾斯滕(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

這具有將額外的更新語句添加到您將要刪除的行中的額外好處,因此應該使事情變得更快,更高效。

這些消息如何分組? 它們屬於對話嗎?

如果是對話(使用has_many:messages),則可以在對話中添加“刪除所有消息”按鈕,以將該對話的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),然后使用它運行查找並更新記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM