如何在对话线程
好吧破坏红宝石一排轨道上针对特定用户的我有一个消息表:如何在对话线程
+-----+-----------+--------------+--------------+-----------+--------+--------------+--------------+
| id | sender_id | recipient_id | body | parent_id | status | created_at | updated_at |
+-----+-----------+--------------+--------------+-----------+--------+--------------+--------------+
| 220 | 4 | 1 | hi | 220 | 0 | 2012-02-1... | 2012-02-1... |
| 221 | 1 | 4 | hey | 220 | 0 | 2012-02-1... | 2012-02-1... |
| 222 | 4 | 1 | hi | 220 | 0 | 2012-02-1... | 2012-02-1... |
| 223 | 1 | 4 | hi | 220 | 0 | 2012-02-1... | 2012-02-1... |
| 232 | 1 | 4 | good | 220 | 0 | 2012-02-1... | 2012-02-1... |
+-----+-----------+--------------+--------------+-----------+--------+--------------+--------------+
我试图找出一种方法来设置的已删除的消息。我发现只有一个状态列是不够的,因为如果将set状态设置为1(等于delete),那么对于两个用户都将删除该消息。
因此,我决定创建一个迁移,在我的消息表中添加sender_status和recipient_status,然后删除状态列。
我在我的控制器的destro动作中有一个update_attribute方法,它在点击删除链接时更新特定的列。我最终会添加一些更多的代码来破坏整个消息,但只有当发送者和接受者地位的都等于1
我的控制器动作:
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
flash[:success] = "Message deleted"
redirect_to :back
end
这有助于设置发送者或接收者的地位。我在我的控制器也有这个:
def show
@current_thread = MessageThread.where('sender_id = ? OR recipient_id = ?', current_user.id, current_user.id).where(:message_id => params[:id]).first
@current_thread_messages = @current_thread.message.children.where(:sender_status => 0, :recipient_status => 0)
end
所以只要消息行的状态是0,消息就会显示。现在,当我删除一条消息时,它仍然不会在会话线程中显示给两个用户。
我似乎无法找出一个干净的方式,使这种删除错觉的工作。 Mayve状态列必须与用户永久连接,或者我需要一个单独的状态列,但事情会变得混乱。这将是一个额外的表,我不得不存储更多的message_id。
我真的很感谢这里的一些专家的帮助。 Kind reagrds
对于我的阅读你的代码,你几乎在那里。据我所知,这只是这条线那就是维持你的新系统就挂了:
@current_thread_messages = @current_thread.message.children.where(
:sender_status => 0,
:recipient_status => 0
)
因为那真实逼都用户不会被删除的消息,这是旧的行为。一个丑陋的,但更有条件的地方,呼吁应该给你你想要的:
@current_thread_messages = @current_thread.message.children.where([
'(sender_id = ? AND sender_status = 0) OR (recipient_id = ? AND recipient_status = 0)',
current_user.id,
current_user.id
])
希望帮助!
PS:对于任何语法错误道歉 - 我仍然on Rails的2.3,所以我只是猜测,事情大多停留在同一...
谢谢,工作完美,所有的权力都在这一行。 – LondonGuy 2012-02-16 22:42:55
双岗豪斯先生:( 的http:// *.com/questions/9327652/updating-more-than-1-atribute-at-one-time-in-ruby-on-rails/9328724#9328724 – TomDunning 2012-02-17 13:05:56