我们如何创建一个空的Active Record Relation并用每个do块填充它?

时间:2013-12-21 06:39:16

标签: ruby-on-rails ruby activerecord ruby-on-rails-4 will-paginate

我有以下代码:

@memberlist = []

    @memberlistpage = @memberlist.paginate(page: params[:page], per_page: 20)

    Member.all.includes(:bronze, :silver, :gold).each do |member|
        if member.bronze
            if member.bronze.skillas.to_s.include?(@assessor.id.to_s)
                @memberlist << member
            end

            if member.bronze.serviceas.to_s.include?(@assessor.id.to_s)
                @memberlist << member
            end

            if member.bronze.precreationas.to_s.include?(@assessor.id.to_s)
                @memberlist << member
            end

            if member.bronze.ajourneyas.to_s.include?(@assessor.id.to_s)
                @memberlist << member
            end
        end
     end

使用该代码即可搜索并将Members添加到数组中。我需要将它添加到Active Record Relation中,以便我可以使用pagination

结构:

表名:成员

#  id              :integer          not null, primary key
#  awardunit_id    :integer
#  name            :string(255)
#  address         :string(255)
#  district        :string(255)
#  gender          :string(255)
#  dob             :date
#  contact         :string(255)
#  email           :string(255)
#  operator        :string(255)
#  entrylvl        :string(255)
#  guardianname    :string(255)
#  guardianaddress :string(255)
#  guardiancontact :string(255)
#  guardianemail   :string(255)
#  currentaward    :string(255)
#  disabled        :boolean          default(FALSE)
#  created_at      :datetime
#  updated_at      :datetime

表名:青铜器

    #  id            :integer          not null, primary key
    #  member_id     :integer
    #  regdate       :date
    #  expdate       :date
    #  compldate     :date
    #  skill         :text
    #  skillas       :integer
    #  service       :text
    #  serviceas     :integer
    #  precreation   :text
    #  precreationas :integer
    #  ajourney      :text
    #  ajourneyas    :integer
    #  created_at    :datetime
    #  updated_at    :datetime

3 个答案:

答案 0 :(得分:0)

Member.none将返回一个空的活动记录关系对象。而不是让所有成员和循环遍历每个成员以获得您想要的内容,如何为每个成员设置查询,然后使用merge来组合它们。

答案 1 :(得分:0)

查询很容易完成这项工作

例如:

Member.joins("LEFT OUTER JOIN bronze on member.id=bronze.member_id").where("bronze.skillas like '%#{@assessor.id}%'").paginate(page: params[:page], per_page: 20)

根据表结构,您可以在上面的查询中为剩余值添加多个连接和where子句条件。

答案 2 :(得分:0)

将数据更改为此类

更改请求会不会更容易
@memberlist = []
Bronze.all.each do | bronze |
  @memberlist << bronze.members.all
end

这可能不起作用,但显示我的意思。青铜器与用户有关,我想是has_many。 那么你得到所有user_id的Bronze.first.all.map(&:user_id)