2

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

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

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

    <% @current_state_jobs.each do |job|  %>
        <tr>
          <td><%= link_to job.job_number, job %></td>
        </tr>
    <% end %>

看起来上面的方法可行 - 但我收到以下错误:undefined method 'each' for nil:NilClass

我应该关注范围还是将每个状态定义为控制器中的方法?也许我应该在循环的开头放一个 if then 语句?有什么想法或推荐阅读吗?

--- 更新 --- 找到解决方案 ---

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

例如:

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

1 回答 1

0

好吧,你的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实例方法,除非你在别处使用它)。

于 2012-12-14T20:50:08.510 回答