Rails优先于类方法与数据库字段

时间:2012-07-27 04:38:21

标签: ruby-on-rails

我有一个Picture类,我想覆盖返回“description”数据库列值,具体取决于某些逻辑。

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

# 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 个答案:

答案 0 :(得分:2)

您尝试做的事情并不完全清楚,但您可以使用super从方法中获取描述值:

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

请注意,我更改了最后一行以使用self.description =,因为我假设您要设置描述值。如果不是这样,那么您不需要将其分配给任何变量。

答案 1 :(得分: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 =只是有点讨厌恕我直言。