这里不需要太多 - 我认为您只需要 map 中的 addresses csv_values。
class User
has_many :addresses
def csv_header
addresses.attribute_names
end
def csv_values
addresses.map do |addr|
addr.attributes.values
end
end
end
class Address
belongs_to :user
end
这能解决你的问题吗?
为了代码的清晰,我很想稍微改变一下,并使用delegate:
class user
...
delegate :attribute_names, to: :addresses, prefix: true, allow_nil: true
...
end
class Address
...
def self.mapped_values
all.map { |addr| addr.attributes.values }
end
...
end
然后你可以打电话给user.addresses_attribute_names 和user.addresses.mapped_values。
您也可以只调用Address.column_names 来获取标头数组,如果它始终保持一致,很可能就是这种情况。
希望有帮助!
根据评论更新:
要为用户实现相同的功能,您可以调用以下代码:
调用User.column_names 或user.attribute_names 来获取标头(前者在类上,后者在实例上)。
如果您还需要用户的映射值,您可以从地址模型中复制 self.mapped_values 方法并使用它。这有点重复,但是对于像这样的一对方法,我不会倾向于将它们分成单独的模块。
最后提示 - 如果您从一组用户(即User.all)调用address 方法,请确保将其调整为include 地址以避免以低效方式访问您的数据库(@987654336 @)。