Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将属性名称从关联的子模型拉到父模型_Ruby On Rails - Fatal编程技术网

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

Ruby on rails 将属性名称从关联的子模型拉到父模型,ruby-on-rails,Ruby On Rails,*我正在尝试将地址模型的属性名称拉到用户模型,但此方法不起作用,因此任何人都可以提供帮助*此处不太需要-我认为您只需要在csv\u值中输入地址 class User has_many :addresses def csv_header self.addresses.attribute_names end def csv_values self.addresses.all do |addr| addr.attributes.values en

*我正在尝试将地址模型的属性名称拉到用户模型,但此方法不起作用,因此任何人都可以提供帮助*

此处不太需要-我认为您只需要在
csv\u值中输入
地址

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
这能帮你解决这个问题吗

为了代码的清晰性,我会尝试稍微改变一些东西,并使用
委托

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
然后,您可以调用
user.addresses\u属性\u名称
user.addresses.mapped\u值

您也可以调用
Address.column\u names
来获取标题数组,前提是它始终保持一致,很可能就是这种情况

希望有帮助


根据评论更新:

要为用户实现同样的功能,可以调用以下命令:

调用
User.column\u names
User.attribute\u names
获取标题(前者在类上,后者在实例上)

如果还需要用户的映射值,则可以从地址模型中跨
self.mapped\u values
方法复制并使用该方法。这有点重复,但对于像这样的一对方法,我不想将它们分离到一个单独的模块中


最后一个提示-如果您正在从一组用户(即
User.all
)调用
address
方法,请确保将其调整到地址,以避免以低效的方式(
User.includes(:addresses)…

)命中数据库。

可能的重复方法非常有用,还可以包括用户模型的属性和地址属性。Morning@MykBKibz-已更新我的答案以包括以下内容:)
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