也许我只是淹死在一杯水中......
我有两个模特。
班级队列
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"
我通过has_many {:through}
关联解决了这个问题。添加对象模型以实现非业务逻辑目的并不是一个好主意。但是,嘿,它有效。
答案 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
这应该从缓存的关联中删除元素,而无需重新加载。