RoR - “delete_at”类似于ActiveRecord :: Associations中的方法

时间:2014-10-18 18:32:23

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

也许我只是淹死在一杯水中......

我有两个模特。

  

班级队列
  has_many:插槽
  结束

     

班级插槽
  结束

rails c

中执行此命令
  

q = Queue.create
  s1 = Slot.create
  s2 = Slot.create
  s3 = Slot.create
  q.slots<< [s1,s2,s3,s2,s3]

现在我想从q.slots列表中仅删除第二个元素,而不删除其他s2元素(如#delete do)。像q.delete_at(1)这样的东西。 有什么建议吗?

感谢。

编辑:

这是我的schema.rb

  

create_table" steps",force:true do | t |
    t.integer value
  结束

     

create_table" queues",force:true do | t |
     t.string名称
   结束

     

create_table" steps_queues",force:true do | t |
     t.integer" step_id"
     t.integer" queue_id"
   结束

     

add_index" steps_queues",[" step_id"],名称:" index_steps_queues_on_step_id"
   add_index" steps_queues",[" queue_id"],name:" index_steps_queues_on_queue_id"

编辑II:

我通过has_many {:through}关联解决了这个问题。添加对象模型以实现非业务逻辑目的并不是一个好主意。但是,嘿,它有效。

3 个答案:

答案 0 :(得分:0)

a = [1,2,3,4,5,6]

a.delete_at(2) # a = [1,2,4,5,6]

delete_at方法将删除传递它的数组的索引。

如果要根据其值删除项目,可以使用删除方法。

pets = ['cat', 'dog', 'rabbit', 'parrot']

a.delete('dog')

# pets = ['cat', 'rabbit', 'parrot']

希望这有帮助

答案 1 :(得分:0)

ActiveRecord :: Associations没有响应#delete_at(它响应但没有任何反应),但是Array做到了!所以:

  

arr = q.steps.to_a#返回一个数组
   arr.delete_at(index_of_item_to_remove)
   q.steps = []#消除所有关联。这是一项q.steps.size次更新的交易    q.steps = arr#插入arr的关联。这是一项arr.steps.size次更新的交易。

Array#delete_at仅删除目标项,而ActiveRecord :: Associations#delete删除所有等效项。

此方法不是最佳方法,导致费用(2 * (q.steps.size - 1)次更新。可以实现一个自定义的SQL语句,这种打破精神,这是一个不好的做法......听起来很脏。 :@

仍在寻找更好的解决方案

答案 2 :(得分:0)

这将有效:

q.slots[1].destroy # will destroy the second record, it will remain in the association cache though
q.slots(true)      # if you need the association again, passing true will refetch

您也可以尝试:

q.slots.delete q.slots[1].destroy

这应该从缓存的关联中删除元素,而无需重新加载。