0

好吧破坏红宝石一排轨道上针对特定用户的我有一个消息表:如何在对话线程

+-----+-----------+--------------+--------------+-----------+--------+--------------+--------------+ 
| 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

+0

双岗豪斯先生:( 的http:// stackoverflow.com/questions/9327652/updating-more-than-1-atribute-at-one-time-in-ruby-on-rails/9328724#9328724 – TomDunning 2012-02-17 13:05:56

回答

2

对于我的阅读你的代码,你几乎在那里。据我所知,这只是这条线那就是维持你的新系统就挂了:

@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,所以我只是猜测,事情大多停留在同一...

+0

谢谢,工作完美,所有的权力都在这一行。 – LondonGuy 2012-02-16 22:42:55