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インスタンスをループして、それぞれの状態に固有のアクションを実行しますか?それとも、特定の 1 つの状態のすべてのジョブを取得してそれらをループしますか?

後者の場合は、その状態のジョブを取得するために使用できるスコープまたはクラス メソッドが必要です。おそらく次のようなものです:

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 に答える