簡體   English   中英

RoR-ActiveRecord :: Associations中的`delete_at`之類的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM