2012-07-27 54 views
0

我有一个Picture类,我想覆盖返回“description”数据库列值取决于某些逻辑。类方法vs数据库字段的Rails优先

这在Rails中有效吗?在返回数据库列值之前,我是否总是可以依赖类来调用类方法?

# database columns for Picture class 
# description => String 
# parent_id => Integer 

class Picture < ActiveRecord::Base 

    def description 
    if parent_id.nil? 
     self.description  
    else 
     description = Picture.find(parent_id).description 
    end 
    end 

end 

找不到在哪里可以找到答案的Rails源代码,所以任何帮助,将不胜感激。

谢谢!

编辑

我试图返回一个图片的描述取决于它是否是一个孩子或父母图片(它们可以被嵌套)。这个例子是有点做作......我可以很容易地通过使用方法不相同的名称数据库列避免这种情况...如

def my_description 
    if parent_id.nil? # return db data since no parent 
     self.description 
    else # return parent's description if one exists 
     description = Picture.find(parent_id).description 
    end 
end 

我想我想在这里不必要的复杂

回答

2

这不是完全清楚你想要做什么,但你可以用超级从方法中得到描述值:

def description 
    if parent_id.nil? 
    super 
    else 
    self.description = Picture.find(parent_id).description 
    end 
end 

注意,我改变了最后一行用self.description =因为我假设你想设置描述值。如果情况并非如此,那么您不需要将它分配给任何变量。

+0

我想返回一个图片的描述取决于它是否是一个孩子或父母的图片(他们可以嵌套)。这个例子是有点人为的......我可以很容易地避免使用与数据库列没有相同名称的方法...例如 def my_description if parent_id.nil? #返回DB数据,因为没有父 self.description如果存在 描述= Picture.find(PARENT_ID).DESCRIPTION 结束 结束 我想我想在这里不必要的复杂 – 2012-07-27 04:58:43

+0

看到 其他#回报父母的描述在原始问题中编辑。试图使用与数据库列相同的名称的方法,但这似乎只是使事情不必要地复杂化 – 2012-07-27 05:04:44

+0

您*可以*使用超级?我认为Rails没有定义属性访问器,如果已经定义了一个叫做相同的方法?只是在我自己的项目中尝试过,看起来你是对的。酷:) – 2012-07-27 05:11:38

1

您应该在您的描述方法中使用read_attribute(:description)(可以覆盖)。

此外,您可以在else部分中执行parent.description而不是Picture.find rigmarole。使用家长协会,我相信你有。

def description 
    # if parent_id is there and the parent object can be found and that parent has a description 
    if (parent_id? && parent && parent.description?) 
    # show parental description 
    parent.description 
    else 
    # read my own database attribute 
    read_attribute(:description) 
    end 
end 

不确定分配给上述说明是否会做任何事情,因为它最终会成为局部变量。而在读者中做self.description =只是稍微令人讨厌的恕我直言。

+0

很酷。看起来像read_attributes(:description)也与Beerlington提出的调用“super”的建议相同。谢谢您的帮助 – 2012-07-27 12:09:25