将属性名称从关联的子模型拉到父模型

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_namesuser.addresses.mapped_values

您也可以只调用Address.column_names 来获取标头数组,如果它始终保持一致,很可能就是这种情况。

希望有帮助!


根据评论更新:

要为用户实现相同的功能,您可以调用以下代码:

调用User.column_namesuser.attribute_names 来获取标头(前者在类上,后者在实例上)。

如果您还需要用户的映射值,您可以从地址模型中复制 self.mapped_values 方法并使用它。这有点重复,但是对于像这样的一对方法,我不会倾向于将它们分成单独的模块。

最后提示 - 如果您从一组用户(即User.all)调用address 方法,请确保将其调整为include 地址以避免以低效方式访问您的数据库(@987654336 @)。

【讨论】:

这很有帮助,还可以包括用户模型的属性和地址属性。 Morning @MykBKibz - 已更新我的答案以包括这个:)

以上是关于将属性名称从关联的子模型拉到父模型的主要内容,如果未能解决你的问题,请参考以下文章

从 Sails.js 中的关联模型访问模型的属性

thinkphp利用模型关联来做关联统计

命名空间模型中的 Rails 关联

如何使用 sequelize.js 从关联模型中加载属性

Rails 5:将belongs_to关联与自定义名称添加到模型和迁移

两个关联模型可以共享相同的连接名称吗?