【问题标题】:Is there a Ruby method that returns the last deleted element in an array?是否有返回数组中最后删除的元素的 Ruby 方法?
【发布时间】:2018-08-16 18:20:25
【问题描述】:

这听起来有点奇怪,因为如果你从 some_array 中删除一个元素,它可能会从内存中消失。 但在某些情况下,最好获取最后一个被删除的项目,例如当跟踪最后一个用户时,有人取消关注(即从他们的后续数组中删除)并在视图中呈现类似“Bob 已停止关注 Smith”的消息。我不确定哪种方法可以实现这一点,因此提出了这个问题。

编辑:我认为在删除之前将项目存储在实例变量中无济于事,因为实例变量仅存在于单个控制器操作中。

以下是一些使用 public_activity gem 的代码 sn-ps:

 class User < ApplicationRecord
   # allow user to follow other users
   has_many :active_relationships, class_name:  "Relationship",
                              foreign_key: "follower_id",
                              dependent:   :destroy
  def unfollow(other_user)
    following.delete(other_user)
  end

end

class Relationship < ApplicationRecord
  include PublicActivity::Model
  tracked owner: ->(controller, model) {controller && controller.current_user}

  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"
  validates :follower_id, presence: true
  validates :followed_id, presence: true
end

class RelationshipsController < ApplicationController
  def destroy
    user = Relationship.find(params[:id]).followed
    current_user.unfollow(user)
    flash[:notice] = "You've stopped following #{user.name}"
    redirect_to users_path
  end
end

我希望我的活动/索引路径呈现一个 _destroy 部分,它将显示用户 x 停止关注用户 y',如下所示:

class ActivitiesController < ApplicationController
  def index
    @activities = PublicActivity::Activity.order("created_at desc")
  end
end 

在视图中:

<% @activities.each do |activity| %>
  <%= link_to  activity.owner.name, activity.owner if activity.owner %>
  <%= render_activity activity %><br>
<% end %>

【问题讨论】:

  • 您为什么不尝试使用布尔字段 true 或 false 来关注和取消关注以跟踪关注的用户,而不是删除 user ?
  • 你能分享一个specific 代码示例来说明你的场景吗?
  • 如果连续两次取消关注会发生什么?我认为跟踪删除之后发生的事情是个坏主意。您应该尝试抓住删除的那一刻,并在删除发生之前 做好事情。
  • 您想要“返回数组中最后删除的元素”跨请求
  • 正如@Gabbar 建议的那样,软删除跟随似乎是要走的路。您可以使用 discard gem 之类的东西(或将其用作您自己实施的指南)。

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-3.2


【解决方案1】:

【讨论】:

    【解决方案2】:

    我想不出一个删除最后一个元素并且不返回它的方法...... 如果你这样做: var = ary.pop 将删除最后一个元素并返回它,您可以将var 保存在另一个表或其他任何东西中...... 如果您想要更强大的解决方案,您可以搜索 papertrail gem。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-02
      • 2021-12-11
      • 2011-04-06
      • 2012-10-22
      • 1970-01-01
      • 2010-12-01
      • 2018-03-31
      • 1970-01-01
      相关资源
      最近更新 更多