【问题标题】:How can I remove and return the first element in an ActiveRecord relation object?如何删除并返回 ActiveRecord 关系对象中的第一个元素?
【发布时间】:2014-02-27 14:35:23
【问题描述】:

我想删除并返回 AR 关系对象中的第一个元素。我使用了shift,但它并没有删除对象。

使用普通数组,移位按预期工作:

a = [1, 2, 3]
a.shift # => 1
a # => [2, 3]

这不起作用。变量@attachment_versions 在使用shift 前后保持相同的大小。

@attachment = Attachment.with_associations.find(params[:id])
@attachment_versions = @attachment.attachment_versions
@current_version = @attachment_versions.shift

# this raises `true`
raise @attachment_versions.include?(@current_version).to_s

def self.with_associations
  includes(attachment_versions: :owner, comments: [:author, :attachments])
end

我知道 AR 关系对象不仅仅是一个数组,但我认为 shift 应该以相同的方式工作。

【问题讨论】:

  • 您能说得更具体些吗?你是如何生成 AR 对象的?它是where 子句吗?您是否希望 shift 修改底层数据库,或者您只是想在本地操作 AR 记录列表?
  • @mbratch 我添加了我的模型代码。
  • 太好了。你能回答其他问题吗,因为这很重要。
  • 您使用的是什么版本的 Rails?因为 AR 关系对象上的 shift 在 Rails 4 中按预期工作。
  • 你可以试试attachment_versions = @attachment.attachment_versions.to_a,然后@current_version = attachment_versions.shift。这假设您只是想在本地对数组进行操作,并且对这种更改底层数据的机制不感兴趣(即,在您执行shift 时删除一条记录)。

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


【解决方案1】:

你可以很容易地先把它变成一个数组。

即

@attachment_versions_array = @attachment_versions.to_a

@attachment_versions_array.shift
=> <Attachment_version......etc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2014-09-24
    相关资源
    最近更新 更多