【问题标题】:Ruby on Rails - Get object association values with array of symbolsRuby on Rails - 使用符号数组获取对象关联值
【发布时间】: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 之类的东西。

标签: ruby-on-rails class reflection symbols


【解决方案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。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多