似乎无法让我的字符串在我看来迭代

时间:2015-10-27 12:08:12

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我有一个字符串,它有多个值,person_ids以及他们有多少个休假日。我想在我看来使用这些数据。

这是我的MyGroupAcc模型:

class MyGroupAcc < ActiveRecord::Base

belongs_to :entry

def self.all_people
  where(person_id: User.all.pluck(:person_id))
end

def self.active_people
  all_people.where(is_active: 'Y')
end

def self.active_vacation_data
  active_people.select(:person_id, :accum_accrued, :taken)
end

def total_v_hours
  accum_accrued.to_d - taken.to_d
end

def total_v_days
   total_v_hours / 8
end

这是我的输入控制器,我的视图操作将是:

def my_group
  peoples_vacation_information = MyGroupAcc.active_vacation_data.all
  peoples_vacation_information.map do |person|
    @p = "person #{person.person_id} has #{person.total_v_days} vacation days"
  end
  render :my_group
end

这是Haml的my_group视图:

%table.table.table-bordered.trace-table
  %thead
    %tr.trace-table
      %th.ts.jp{:style => 'border: solid black;'} Person ID
      %th.ts.jp{:style => 'border: solid black;'} Total Vacation Days

      %tr.trace-table
      -@p.each do |r|
        %tr.trace-table
          %td.trace-table{:style => 'border: solid black;'}= r

在我看来,我收到了这个错误:

udefined method `each' for "person 22076 has 3.0 vacation days":String

但是在我的控制台中,运行此代码时会得到这个

peoples_vacation_information = MyGroupAcc.active_vacation_data.all
peoples_vacation_information.map do |person|
    @p = "person #{person.person_id} has #{person.total_v_days} vacation days"
end

这就是吐出来的,这是我希望在我的观点中看到的:

["person 16016 has 7.0 vacation days", "person 16256 has 0.0 vacation days", "person 16256 has 18.5 vacation days", "person 17258 has 0.0 vacation days", "person 17258 has 5.0 vacation days", "person 17371 has 0.0 vacation days", "person 17371 has 20.0 vacation days", "person 19551 has 0.0 vacation days", "person 19551 has 26.5 vacation days", "person 20850 has 0.5 vacation days", "person 20850 has 14.0 vacation days", "person 21714 has 0.5 vacation days", "person 21714 has 1.0 vacation days", "person 22076 has 0.0 vacation days", "person 22076 has 3.0 vacation days"]

2 个答案:

答案 0 :(得分:1)

这样做:

def my_group
   @peoples_vacation_information = MyGroupAcc.active_vacation_data.all
end

#app/views/my_group_acc/my_group.html.erb
%table.table.table-bordered.trace-table
    %thead
      %tr.trace-table
        %th.ts.jp{:style => 'border: solid black;'} Person ID
        %th.ts.jp{:style => 'border: solid black;'} Total Vacation Days

        %tr.trace-table
     - @peoples_vacation_information.each do |person|
        %tr.trace-table
          %td.trace-table{:style => 'border: solid black;'}= "person #{person.person_id} has #{person.total_v_days} vacation days"
<% end %>

问题是您将@p变量作为字符串(rob已修复)。

除了语法问题之外,它的构造很糟糕有两个原因 - 首先,你要拆分一个非常好的集合(你可以将它传递给你的视图)其次,你试图构建另一条数据只是为了拆分它。

您最好在控制器中设置@instance_variable,然后您可以在视图中循环播放。

您最好在MyGroupAcc模型中使用scopes(可以链接,不用担心):

#app/models/my_group_acc.rb
class MyGroupAcc < ActiveRecord::Base
    belongs_to :entry

    scope :all_people,           -> { where(person_id: User.pluck(:person_id)) }
    scope :active_people,        -> { where is_active: "Y" }
    scope :active_vacation_data, -> { active_people.select(:person_id, :accum_accrued, :taken) }

    def total_v_hours
       accum_accrued.to_d - taken.to_d
    end

    def total_v_days
       total_v_hours / 8
    end
end

答案 1 :(得分:0)

@p这里只是一个简单的字符串,而不是数组或集合。

你可以用这个解决这个问题

@p=peoples_vacation_information.map do |person|
  "person #{person.person_id} has #{person.total_v_days} vacation days"
end