Rails:获取具有某些条件的所有对象

时间:2015-07-15 22:46:04

标签: ruby-on-rails-4

我有一个类设备,它有一个方法来确定对象是否可用。 这个方法有一些逻辑来检查思想是否有一个has_many关联,并返回true或false,因此,它只适用于实例化对象。

有一些方法可以做:

@someVar = Equipament.all.available

我解决了这个问题:

equipament.rb

has_many :rents
  def available
    if(self.rents.blank?)
      return true
    else
      if(self.rents.last.end.blank?)
        return false
      else
        return true
      end
    end
  end

  def self.usable
    ary = Array.new
    Equipament.all.each do |eq|
      if eq.available
        ary.push(eq)
      end
    end
    return ary
  end

然后

@someVar = Equipament.usable

但是,这是一种不错的方式还是有更高效/优雅的东西?

2 个答案:

答案 0 :(得分:1)

除了您的代码可能进行的无限数据库查询之外,整个方法并不灵活。除了available之外,rents除了available之外还有许多其他原因。例如,它可能在维护中。这意味着使state方法更加复杂。因此,我认为为Equipment定义Equipment.state将更容易维护。您可以根据特定事件更改Equipment.state。在您的情况下,您可以在有人租用时将rented更改为available,并在返回时将其更改回# models/equipament.rb def self.available where(state: :available) end 。您现在不仅可以涵盖更多案例,而且您还可以使用一种简单的方法获取所有可用设备的列表,该方法仅向数据库发出一个查询:

{{1}}

答案 1 :(得分:0)

这应该可以解决问题

equipament.rb

has_many :rents
def available
  (self.rents.blank? && !self.rents.last.end.blank?) ? true : false
end

def self.usable
  ary = Array.new
  Equipament.all.each do |eq|
    if eq.available
      ary.push(eq)
    end
  end
  return ary
end