循环通过状态 – 范围? 的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
实例方法)。