Ruby on rails Rails是一种更好的方式,通过字段从中获取项目,它有很多关联

Ruby on rails Rails是一种更好的方式,通过字段从中获取项目,它有很多关联,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,如果这是一个基本问题,请原谅我;我正在使用3.2学习Rails 我的事件模型有很多图像。每个图像都有一个is_主布尔字段。事件应该有一个cover_image方法,该方法返回设置为true的图像,否则返回第一个图像。这是我的代码: def cover_image imgs = self.images imgs.each { |i| return i if i.is_primary } # If no primary return imgs.first end

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

我的事件模型有很多图像。每个图像都有一个is_主布尔字段。事件应该有一个cover_image方法,该方法返回设置为true的图像,否则返回第一个图像。这是我的代码:

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

我忍不住觉得有更好的方法可以做到这一点,一种不需要循环所有元素就可以找到一个的方法

您可以很容易地在范围内完成此操作:

图像模型

scope :primary, where(:is_primary => true)
事件模型

def cover_image
  images.primary.first
end
def cover_image
  images.where(:is_primary => true).first
end
这是一个非常基本的示例,至少应该让您开始学习,例如,您希望在它的基础上优雅地处理丢失的主映像

为了完整性,如果希望直接使用where语句,则不必将其作为作用域。示波器非常适合保持干燥:

事件模型

def cover_image
  images.primary.first
end
def cover_image
  images.where(:is_primary => true).first
end

您可以很容易地在范围内完成此操作:

图像模型

scope :primary, where(:is_primary => true)
事件模型

def cover_image
  images.primary.first
end
def cover_image
  images.where(:is_primary => true).first
end
这是一个非常基本的示例,至少应该让您开始学习,例如,您希望在它的基础上优雅地处理丢失的主映像

为了完整性,如果希望直接使用where语句,则不必将其作为作用域。示波器非常适合保持干燥:

事件模型

def cover_image
  images.primary.first
end
def cover_image
  images.where(:is_primary => true).first
end

是的-我也有同样的问题,但是我用images.find修复了它,但是因为您使用的是is_主字段,所以这不起作用。有一个更好的方法可以做到这一点,因为每次我迭代-它查询数据库Yea-我都有相同的问题,但我使用images.find修复了它。但是由于您使用的是IS_主字段,所以这不起作用。有一种更好的方法可以做到这一点,因为每次我迭代时,它都会查询数据库