循环通过状态 – 范围? 的Ruby / Rails

我希望能够根据当前状态循环遍历模型。

我为我的模型创建了相当简单的状态,如下所示:

models/job.rb class Job < ActiveRecord::Base has_many :events, class_name: "JobEvent" STATES = %w[bids in_progress complete canceled] delegate :bids?, :in_progress?, :complete?, :canceled?, to: :current_state def current_state (events.last.try(:state) || STATES.first).inquiry end end 

 models/job_event.rb class JobEvent < ActiveRecord::Base belongs_to :job attr_accessible :state validates_presence_of :job_id validates_inclusion_of :state, in: Order::STATES def self.with_last_state(state) order("id desc").group("job_id").having(state: state) end end 

国家工作 – 我可以改变国家就好。 我希望能够根据当前状态循环遍历模型。 不确定最好的方法。 我是新的范围,并试图循环我的状态如下(不工作):

 views/index.html.erb      

它似乎上面的工作 – 但我得到以下错误: undefined method 'each' for nil:NilClass

我应该关注范围还是将每个状态定义为控制器中的方法? 也许我应该在循环开始时加上if then语句? 任何想法或推荐阅读?

—更新—解决方案—

我最终在我的控制器索引方法中为每个状态添加实例。 然后在我的索引中添加一个选项卡式视图,以便一次循环遍历每个状态。

例如:

 class JobsController  ['bids', 'in_progress', 'complete']) #all job states @bids = Job.where(:state => ['bids']) ... and so on for each state ... 

好吧,你undefined method错误是因为当你期望它是一个集合时, @current_state_jobs是nil。 您需要在控制器的index方法中为其分配一些值。

我不确定你的问题是否清楚。 您是要遍历所有Job实例并执行特定于每个状态的操作,还是要获取某个特定状态的所有作业并循环执行这些操作?

如果是后者,则需要一个范围或类方法,可用于获取该状态的作业。 也许是这样的:

 class Job < ActiveRecord::Base def self.with_state(state) joins(:events).where("job_event.state = ?",state) end end @current_state_jobs = Job.with_state("in_progress") 

(除非你在其他地方使用它,否则你需要current_state实例方法)。