【问题标题】:Get value of attribute when iterating over array of objects (getting nils)迭代对象数组时获取属性值(获取 nil)
【发布时间】:2012-01-24 00:27:43
【问题描述】:

在我的Guest 模型中,我有这个方法可以从关联模型中返回一个 id 列表:

def self.people_list(consultant_id)
  # returns an array of ids of people who attended parties for a given consultant
  people = self.select(:person_id).joins('INNER JOIN parties ON guests.party_id = parties.id').where('parties.consultant_id = ?', consultant_id).collect{ |g| g.person_id }
end

person_id 是 Guest 模型中的一个字段。但我得到的是一系列 nil。从 rails 控制台我可以看出查询是正确的,并且它返回了正确数量的对象。我只是没有将它们放入数组中。

感谢您的帮助。

P.S.,如果有帮助/重要,顾问有很多派对,有很多客人。来宾有一个 person_id,它连接到 People 表。我正在尝试从 Guest 表中找到所有参加给定顾问聚会的 person_id。

从控制台(更改为如下所述的 rails 关联语法后)

Guest Load (0.3ms)  SELECT person_id FROM `guests` INNER JOIN `parties` ON `parties`.`id` = `guests`.`party_id` WHERE (parties.consultant_id = 1)
=> [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil] 

【问题讨论】:

  • 首先删除“INNER JOIN”并使用 rails 关联,例如Guest(:consultant_id).parties 如果控制台中的行为与应用程序不同,那么您使用的是不同的 ID

标签: ruby-on-rails ruby


【解决方案1】:

在我看来,您应该将此视为主要对象。

def attendees
  @attendees = []
  parties.each do |p|
    @attendees << p.guests.collect(&:person_id)
  end
  @attendees
end

然后在顾问对象上调用该方法。

【讨论】:

  • 谢谢,我试图尽量减少 sql 调用的次数,因为这个方法会被频繁调用。不过,我同意它属于顾问。我想我可以通过重构来做到这一点。
【解决方案2】:

所以,我意识到我在 :people_id 上有 attr_accessor,这就是导致 nils 的原因。我需要将其留给系统的另一方,但我能够通过将 g.person_id 替换为 g[:person_id] 来获得正确的值。

我不太明白为什么,但它确实有效......

【讨论】:

  • 使用[] 表示法访问属性会绕过对象上的方法来获取属性值。所以当你使用g[:person_id]时,你基本上绕过了你通过attr_acessor :people_id创建的getter
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 2015-04-05
  • 2019-08-12
  • 2018-11-28
相关资源
最近更新 更多