我有一个具有父子关系的表/模型。 这个想法是允许"别名"对于艺术家的名字。
表:艺术家
+----+--------------------+-----------+
| 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
回调中返回该对象?
我希望这是不可能的,但我想问一下。
答案 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
名称返回艺术家。