1

如果这是一个基本问题,请原谅我;我正在学习 Rails(使用 3.2)。

我的Event模型has_many images。每个图像都有一个is_primary布尔字段。Event应该有一个cover_image方法,它返回is_primary设置为 true 的图像,否则返回第一张图像。这是我的代码:

def cover_image
    imgs = self.images
    imgs.each { |i| return i if i.is_primary }
    # If no primary
    return imgs.first
  end

我不禁觉得有一种更好的方法可以做到这一点,一种不涉及循环遍历所有元素只是为了找到一个。

4

1 回答 1

4

你可以很容易地用范围来做到这一点:

图像模型

scope :primary, where(:is_primary => true)

事件模型

def cover_image
  images.primary.first
end

这是一个非常基本的示例,至少应该可以帮助您入门,例如,您需要在它的基础上优雅地处理丢失的主图像。

为了完整起见,您不必其作为范围来执行,如果您愿意,可以直接使用 where 语句。Scopes 非常适合保持 DRY:

事件模型

def cover_image
  images.where(:is_primary => true).first
end
于 2013-06-17T19:10:26.603 回答