Ruby on Rails - 使用符号数组获取对象关联值

Posted

技术标签:

【中文标题】Ruby on Rails - 使用符号数组获取对象关联值【英文标题】:Ruby on Rails - Get object association values with array of symbols 【发布时间】:2015-12-04 20:25:09 【问题描述】:

例如,有模型:

class Activity < ActiveRecord::Base
    belongs_to :event
end

class Event < ActiveRecord::Base
    has_many :activities
    attr_accessible :foo
end

我可以通过activity.event.foo获取活动的事件foo(很简单)。

但是我想创建一个通用函数,它首先确定一个对象是否具有belongs_to 关联,然后通过belongs_to 关联获取该对象的foo(假设所有对象都通过belongs_to 关联具有一个foo)?

到目前为止,我有以下几点给了我一个反思:

def get_foo(object)
    object.class.reflect_on_all_associations(:belongs_to).each do |belongs_to|
        return object.??????
    end
end

我可以通过belongs_to.klass(例如[Event])获取反射的类名数组,或者通过belongs_to.name(例如[:event])获取belongs_to关联的符号数组。

根据我从反射中得到的信息,我如何获得对象的 belongs_to 的 foo?

有没有更简单的方法可以在不使用反射的情况下做到这一点?

我希望这很简单,我只是在讨论如何解决这个问题。我也希望我有点清楚。这是我的第一个 Stack Overflow 问题。

【问题讨论】:

delegate 会帮助你吗? 不确定委托是否会帮助我。这将要求我遍历每个模型并将属性委托给与它有 belongs_to 关系的每个模型。如果我已经有了关联的符号,似乎必须有一种方法来获得关联。 object.association(belongs_to).foo 之类的东西。 【参考方案1】:

你可以这样做,但它并不完全漂亮:

def get_foo(object)
  object.class.reflect_on_all_associations(:belongs_to).map do |reflection|
    object.send(reflection.name).try(:foo)
  end
end

这将为您提供与该对象关联的所有 foo 的数组。您可以将其更改为不执行 map 并执行 first 或其他操作。

【讨论】:

这就是我想要的。完全忘记了object.send。谢谢!

以上是关于Ruby on Rails - 使用符号数组获取对象关联值的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试从 ruby​​ on rails 上的表单获取输入时,我得到了简单名称的哈希数组瞬间。如何解决?

如何存储和比较:ActiveRecord 中的符号(Ruby on Rails)

使用 Ruby on Rails 从数据库中的 yaml 序列化字段中获取大小数

Ruby on rails:仅从两列范围内获取数据

Ruby on Rails:将数组的 javascript 数组发送到 ruby​​ 控制器

ruby on rails (函数使用)