比方說,我有一個具有很多屬性的Rails模型,並且我想要複製其中的大部分或全部,而不復制只是ID和前幾個字段。無需手動輸入所有字段名稱來複制屬性散列,而是通過什麼方式來完成此操作?如何通過索引分割紅寶石中的散列? Rails模型之間的用例複製屬性
回答
將散列轉換爲數組,選擇索引,轉換回散列。在這個例子中,我想複製所有從model_1的屬性model_2從索引4.顯然model_1和model_2必須爲同一型號
hash = model_1.attributes
model_2.attributes = hash.to_a[4..-1].to_h
當然,我們也可以做到這
model_1.attributes = model_2.attributes.to_a[4..-1].to_h
你可以使用'-1'索引來代替'hash.length':'model_2.attributes = hash.to_a [4 ..- 1] .to_h' – Ilya
我相信你想要'[4..hash_length-1]'或者'[4 ... hash_length]'(後一種情況下是三個點)。你也可以編寫'[4,hash_length-4]',但是[4,-1]'當然是最好的。 –
'''[4 ..- 1]'''簡潔。喜歡! – lacostenycoder
您可以指定所有屬性你不使用except
方法要:
model_2.attributes.except(:id, :other_attribute, :and_another)
或'slice'指定想要使用的所有屬性 – Ilya
考慮將其更改爲'model_2.attributes.except(* model_2.attributes.keys.first(n))'。 –
我知道除了方法,但是避免必須鍵入屬性的名稱,因爲我很懶,不在乎這些名字在這種情況下;) – lacostenycoder
您可以使用select
種with_index
方法你的目標:
model_2.attributes = model_1.attributes.select.with_index { |_, i| i >= 4 }
在這種情況下,你可以指定任何屬性位置間隔。
讀者被提醒,這是[Hash#select](http ://ruby-doc.org/core-2.2.0/Hash.html#method-i-select),而不是[Enumerable#select](http://ruby-doc.org/core-2.2.0/Enumerable html的#方法-i的選擇)。 –
我認爲你的意思是在作業左側的model_2.attributes,但是這個工作得很好。 – lacostenycoder
- 1. 如何通過紅寶石寶石
- 2. 集團通過散列紅寶石
- 3. 紅寶石通過散列迭代
- 4. 紅寶石:超載索引分配到實例屬性
- 5. 紅寶石散列在紅寶石
- 6. 散列散列的紅寶石散列
- 7. 差分之間2不同的嵌套散列紅寶石1.8.7
- 8. 通過索引從數組紅寶石
- 9. 如何通過紅寶石
- 10. 紅寶石散列與自引用元素/遞歸散列
- 11. 紅寶石散列迭代中,索引訪問和值映射
- 12. 如何通過紅寶石
- 13. 如何通過grep與紅寶石分割文件?
- 14. 紅寶石 - 通過陣列
- 15. 紅寶石分割問題
- 16. 紅寶石散列,group_by值
- 17. 如何通過紅寶石
- 18. 移從紅寶石散列
- 19. 紅寶石散列組合
- 20. 排序散列紅寶石
- 21. 紅寶石散列到JavaScript散列
- 22. 通過紅寶石散列哈希中的迭代
- 23. 如何獲取紅寶石陣列中元素的複製索引
- 24. 紅寶石,轉散列的陣列分成單個散列
- 25. 紅寶石 - find_or_intialize_by未分配的屬性
- 26. 紅寶石 - 從散列
- 27. 紅寶石變換散列
- 28. 反向散列紅寶石
- 29. 操縱散列紅寶石
- 30. 紅寶石:建立通過映射陣列散列到陣列
通過提供一個小例子並顯示期望的返回值,可以改進此問題。也許從你的答案中拉出你的例子,並編輯你的答案來參考問題中的例子。 –
請閱讀「[問]」和「[mcve]」。爲我們提供一個例子或更好的描述。 –