[英]RoR - `delete_at` like method in ActiveRecord::Associations
也許我只是被一杯水淹死了...
我有兩個模型。
類隊列
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一樣)。 類似於q.delete_at(1)
。 有什么建議么?
這是我的schema.rb
create_table“ steps”,強制:true | t |
t。整數值
結束create_table“ queues”,強制:true | t |
t。字符串名稱
結束create_table“ steps_queues”,強制:true做| 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”],名稱:“ index_steps_queues_on_queue_id”
我采用has_many {:through}
關聯解決了這個問題。 添加對象模型以實現非業務邏輯目的不是一個好主意。 但是,嘿,它有效。
a = [1,2,3,4,5,6]
a.delete_at(2) # a = [1,2,4,5,6]
delete_at方法將刪除您傳遞給它的數組的索引。
如果要根據項目的值刪除項目,則可以使用delete方法。
pets = ['cat', 'dog', 'rabbit', 'parrot']
a.delete('dog')
# pets = ['cat', 'rabbit', 'parrot']
希望這可以幫助
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語句,這種中斷方式很糟糕,聽起來很臟。
仍在尋找更好的解決方案
這將起作用:
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
這應該從緩存的關聯中刪除元素,而無需重新加載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.