将属性名称从关联的子模型拉到父模型
Posted
技术标签:
【中文标题】将属性名称从关联的子模型拉到父模型【英文标题】:Pulling attribute names from associated child model to parent model 【发布时间】:2017-11-29 15:34:53 【问题描述】: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
*我正在尝试将地址模型的属性名称拉到用户模型,但是这种方法不起作用,所以任何人都可以帮助*
【问题讨论】:
How to get an array with column names of a table的可能重复 【参考方案1】:这里不需要太多 - 我认为您只需要 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 @)。
【讨论】:
这很有帮助,还可以包括用户模型的属性和地址属性。 Morning @MykBKibz - 已更新我的答案以包括这个:)以上是关于将属性名称从关联的子模型拉到父模型的主要内容,如果未能解决你的问题,请参考以下文章