寫出一個從 csv 匯入的 rake 任務,人們傾向于這樣寫
Article.create(
category_id: row[0],
label: row[1],
name: row[2],
integer: row[3],
priority: row[4]
)
但是這些需要重構考慮到一個元結構,其中
Class Import
has_many :importattributes
以下在語法上不正確
Article.create(
import.importattributes.each do |importattribute|
m_attr = importattribute.mapped_attribute
sequence = importattribute.position.to_i
m_attr: row[sequence]
end
)
如果該行syntax error, unexpected ':', expecting 'end'
m_attr: row[sequence] 被注釋掉,則其他操作會運行,因為它們不會事先決議此錯誤。
我認為這被誤認為是正確創建屬性陣列,因為更新操作是基于每個屬性的
import.importattributes.each do |importattribute|
m_attr = importattribute.mapped_attribute
sequence = importattribute.position.to_i
Article.update(m_attr: row[sequence])
end
不會引發錯誤。
uj5u.com熱心網友回復:
這不是一個有效的語法m_attr: row[sequence]。當用作它的引數時,update它被視為一個哈希{ m_attr: row[sequence] }并且可以省略大括號。
Article.create(
import.importattributes.each do |importattribute| # returns `import.importattributes`
# and used as argument for `create`
# nothing from `each` block is used
m_attr = importattribute.mapped_attribute # `m_attr` is unused
sequence = importattribute.position.to_i
m_attr: row[sequence] # invalid syntax
# at the very least it has to be wrapped in {} and used with hashrocket syntax
# to make use of m_attr variable.
# { m_attr => row[sequence] }
end
)
create接受屬性散列來創建單個記錄或散列陣列來創建多個記錄。匯入邏輯的回傳值必須是這兩個選項之一。為清楚起見,可以分三個步驟完成:
attributes = {}
import.importattributes.each do |importattribute|
attribute_name = importattribute.mapped_attribute
csv_column = importattribute.position.to_i
attributes[attribute_name] = row[csv_column] }
end
Article.create(attributes)
或一步使用inject
Article.create(
import.importattributes.inject({}) do |attributes, importattribute|
attributes[importattribute.mapped_attribute] = row[importattribute.position.to_i]
attributes
end
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/460260.html
