在回调方法中返回特定对象

时间:2015-12-06 15:20:53

标签: ruby-on-rails

我有一个具有父子关系的表/模型。 这个想法是允许"别名"对于艺术家的名字。

表:艺术家

+----+--------------------+-----------+
| id | name               | parent_id |
+----+--------------------+-----------+
|  1 | The Rolling Stones |           |
|  2 | Rolling Stones     |         1 |
+----+--------------------+-----------+

档案:artist.rb

class Artist < ActiveRecord::Base
  has_many   :songs
  has_many   :children, class_name: 'Artist', foreign_key: 'parent_id'
  belongs_to :parent,   class_name: 'Artist'
end

我试图通过别名来获取父级艺术家,所以我尝试在after_find回调中实现这一点。 我将其添加到Artist类:

  after_find :get_parent_if_exists

  private
  def get_parent_if_exists
    Artist.find( self.parent_id ) if self.parent_id
  end

现在,在执行Artist.find_by( name: "Rolling Stones" )时,我希望它会返回ID为1的对象,但它会返回ID 2.但是,我看到父对象被查询但未返回。 我的问题:有没有办法在after_find回调中返回该对象?

我希望这是不可能的,但我想问一下。

1 个答案:

答案 0 :(得分:1)

你正在混合一些东西。

after_find回调可以帮助您在找到对象后执行某些操作。

Artist.find_by( name: "Rolling Stones" )返回的是一个符合过滤器的对象 - 你不能再返回另一个对象然后是数据库中找到的对象。

当然,您可以覆盖find_by方法,但这是毫无意义的。

修改

要获取父级,您已经拥有一个现有方法,由Rails在您声明belongs_to :parent时提供。

所以

Artist.find_by( name: "Rolling Stones" ).parent

必须使用The Rolling Stones名称返回艺术家。