Ruby on rails 4 Rails:获取具有某些条件的所有对象
我有一个类设备,它有一个确定对象是否可用的方法。 这个方法有一些逻辑来检查a是否有很多关联,并返回true或false,因此,它只在实例化的对象中工作 有一些方法可以做如下事情:Ruby on rails 4 Rails:获取具有某些条件的所有对象,ruby-on-rails-4,Ruby On Rails 4,我有一个类设备,它有一个确定对象是否可用的方法。 这个方法有一些逻辑来检查a是否有很多关联,并返回true或false,因此,它只在实例化的对象中工作 有一些方法可以做如下事情: @someVar = Equipament.all.available 我解决了这个问题: equipament.rb has_many :rents def available if(self.rents.blank?) return true else if(self
@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
但是,这是一种很好的方法还是有更高效/优雅的方法?除了代码可能进行的无限数据库查询之外,整个方法并不灵活。除了
租金
之外,设备
不可用还有许多其他原因。例如,它可能在维护中。这意味着使方法变得更加复杂。因此,我认为为设备定义状态
会更容易维护。您将根据某些事件更改设备状态。在您的情况下,您可以在有人租用时将设备.state
更改为租用的
,并在归还时将其更改回可用的
。现在,您不仅可以涵盖更多的案例,还可以通过一种简单的方法获取所有可用设备的列表,该方法只需向数据库发出一个查询:
# models/equipament.rb
def self.available
where(state: :available)
end
这应该能奏效
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
但是它需要数据库中的另一个字段,我必须正确地维护它,对吗?@Techmago因为我不知道你案件的全部背景,所以不可能做出明智的意见。然而,总的来说,在数据库中维护一个额外的字段似乎是一个合理的权衡。是的,我认为最终,这将是最好的选择。我总是尽一切努力减少数据库中字段的数量。。。我发现最好的选择是使用状态机gem来处理这些状态,这允许我以后添加更多的状态