【问题标题】:How to retrieve a model's record attributes including has_many ids as a hash?如何检索模型的记录属性,包括 has_many ids 作为哈希?
【发布时间】:2017-02-14 19:20:46
【问题描述】:

假设我有以下课程:

class User < ActiveRecord::Base
  has_many :addresses
end

我正在初始化以下记录:
user = User.new(first_name: "John", last_name: "Doe", address_ids: [1, 2, 3])
Rails 已经提供了一种方便的方法来检索模型记录的属性:
user.attributes # => {first_name: "John", last_name: "Doe"}
但是,我还需要得到一个包含address_ids 的哈希,即:

user.attributes_with_has_many_associations 
# => {first_name: "John", last_name: "Doe", address_ids: [1, 2, 3]} 

我正在寻找在任何给定记录上执行此操作的 通用 方法(即不涉及反映关联以提取属性并最终污染模型本身,毕竟我'我正在寻找一种纯粹出于测试目的的方法)或至少在测试代码中隔离一个方法。

【问题讨论】:

  • User.address_ids 不应该给你确切的信息吗?如果您已经将 ids 保存为数组,您可以像这样检索相同的,不是吗?
  • 没有内置的方法可以做到这一点。只需手动添加您想要的关联,即user.attributes.tap { |a| a[:address_ids] = a.address_ids }

标签: ruby-on-rails ruby ruby-on-rails-4 rspec ruby-on-rails-5


【解决方案1】:

不确定是否有 Rails 方法,但您可以自己定义。

def attributes_with_has_many_associations
  attributes.merge(
    self
      .class
      .reflect_on_all_associations(:has_many)
      .map(&:plural_name)
      .map { |as| { as.to_sym => self.send(as) } }
      .reduce(&:merge)
  )
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多