class User
has_many :addresses
def csv_header
self.addresses.attribute_names
end
def csv_values
self.addresses.all do |addr|
addr.attributes.values
end
end
end
class Address
belongs_to :user
end
*我试图将地址模型的属性名称拉到用户模型,但这种方法不起作用所以任何人都可以帮助*
这里不需要 - 我想你只需要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
方法并使用它。这有点重复,但对于这样的一对方法,我不打算将它们分成一个单独的模块。
最后提示 - 如果你从一组用户(即address
)调用User.all
方法,请确保将其调整为include地址,以避免以低效的方式命中数据库(User.includes(:addresses)...
)。