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

问题描述 投票:0回答:1
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

*我试图将地址模型的属性名称拉到用户模型,但这种方法不起作用所以任何人都可以帮助*

ruby-on-rails
1个回答
1
投票

这里不需要 - 我想你只需要map addressescsv_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_names,要么调用user.attribute_names来获取标题(在前者的类中,以及后者的实例)。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.