我有以下型号:
class AuthorizedDriver < ActiveRecord::Base
belongs_to :car
def authorized?
!self.authorized_until.nil? && self.authorized_until.to_date >= Time.current.to_date
end
end
我希望能够做到:
def show_authorized_drivers
@car = Car.find(params[:id])
@authorized_drivers = @car.authorized_drivers.where(authorized?: true)
end
我知道我可以使用特定字段执行此操作,但我想使用上面的authorized?
函数(或稍后的其他函数)。
非常感谢任何关于此的指导,谢谢!
我正在使用Rails 4.1.4和Ruby 2.1.2。
答案 0 :(得分:3)
你可以这样做:
@authorized_drivers = @car.authorized_drivers.to_a.select(&:authorized?)
请注意,这会获取该汽车的所有authorized_drivers
,然后通过调用#authorized?
方法对其进行过滤。
另请注意
.select(&:authorized?)
是
的快捷符号.select {|it| it.authorized? }
答案 1 :(得分:3)
将以下scope
添加到您的Driver
模型中:
scope :authorized, -> { where('authorized_until >= ?', Time.current) }
然后你可以查询这样的汽车的授权司机:
@authorized_drivers = @car.authorized_drivers.authorized
更新(回答您的评论):如果您需要添加其他条件,则有两个选项。
您可以将两个条件合并到一个范围中:
scope :authorized, -> {
where('authorized_until >= ?', Time.current).where(status: 'Active')
}
或者您可以添加另一个范围:
scope :active, -> { where(status: 'Active') }
只是链接范围:
@authorized_drivers = @car.authorized_drivers.authorized.active