現在の状態に基づいてモデルをループできるようにしたいと思います。
次のように、モデルのかなり単純な状態を作成しました。
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
...