Ruby查询需要更新

时间:2017-07-06 07:22:49

标签: ruby ruby-on-rails-2

关系:

  

帐户has_many用户

     

用户has_one sima

primary_partner_id是" account_id"这是一种传递。

User.where(primary_partner_id: 2).map{|a| a.sima}.reject{ |e| e.to_s.empty?}

结果如下:

 [
    #<Sima id: 93, user_id: 7, interviewer_account_user_id: 1945, interviewer_completion_date: "2017-06-09", transcriber_account_user_id: nil, transcriber_completion_date: nil, biographer_account_user_id: nil, biographer_completion_date: nil, reviewer_account_user_id: nil, reviewer_completion_date: nil, status: "accepted", autobiographical_form: "27381", autobiographical_form_completion_date: nil, sima_level_id: "1", created_at: "2017-06-06 20:17:57", updated_at: "2017-06-09 10:04:33", autobiographical_form_comments: nil, on_hold: nil, comments: [{:comment=>"easylims.xlsx", :user_name=>"Mike Burns", :created_at=>2017-06-06 20:17:57 UTC}, {:comment=>"ok", :user_name=>"SIMA Admin", :created_at=>2017-06-06 20:19:33 UTC}], interviewer_id: nil, interviewer_start_date: nil, transcriber_start_date: nil, biographer_start_date: nil, reviewer_start_date: nil>, 
    #<Sima id: 92, user_id: 1, interviewer_account_user_id: nil, interviewer_completion_date: nil, transcriber_account_user_id: nil, transcriber_completion_date: nil, biographer_account_user_id: nil, biographer_completion_date: nil, reviewer_account_user_id: nil, reviewer_completion_date: nil, status: "accepted", autobiographical_form: "27437", autobiographical_form_completion_date: nil, sima_level_id: "1", created_at: "2017-06-06 20:01:50", updated_at: "2017-06-06 20:22:50", autobiographical_form_comments: nil, on_hold: nil, comments: [{:comment=>"original_msg (1).txt", :user_name=>"bild_cloud@bild.org", :created_at=>2017-06-06 20:01:50 UTC}, {:comment=>"ok", :user_name=>"SIMA Admin", :created_at=>2017-06-06 20:22:05 UTC}], interviewer_id: nil, interviewer_start_date: nil, transcriber_start_date: nil, biographer_start_date: nil, reviewer_start_date: nil>
 ]

Sima具有类似状态,我有三种状态为&#34;待定,接受,拒绝&#34;

问题:

现在我想根据状态显示结果,用户将其作为params传递。所以结果应该是Sima的状态。如果params是status =&#34;公认&#34;然后司马列表将只有哪个状态&#34;接受&#34;

6 个答案:

答案 0 :(得分:5)

通过这样做,您可以避免N + 1查询问题

User.includes(:sima).where(sima: {status: params[:status]},primary_partner_id: params[:account_id]).map(&:sima)

如果您使用加入 - &gt;在map语句中,每次调用查询时,我们首选使用includes,以获取更多信息

您可以参考此链接

<强> http://guides.rubyonrails.org/active_record_querying.html

答案 1 :(得分:0)

使用模型上的相同关联,您可以这样做(假设用户通过了status他们想要看到的内容:

user_ids = User.where(primary_partner_id: 2).pluck(:id)
Sima.where(user_id: user_ids, status: params[:status])

上面会对数据库进行两次打击,但这完全没问题。您可以使用includesmap,但我认为这不会带来巨大的性能优势,具体取决于您拥有的帐户中的用户数量。无论如何,这里是:

User.includes(:sima)
  .references(:sima) # you need this if you use Rails 4 +
  .where(users: { primary_partner_id: 2 })
  .where(simas: { status: params[:status] })
  .map(&:sima)

但是,我建议您通过关联使用has_many更新帐户模型。

class Account
  has_many :users
  has_many :simas, through: :users
end

# To get sima of a particular status
Account.find(2).simas.where(status: param[:status])

这样,您只需account.simas即可从属于该帐户的所有用户获取sima。

答案 2 :(得分:0)

您可以加入simas模型和用户模型

User.joins("JOIN simas ON simas.user_id = users.id")
    .where(primary_partner_id: 2, "simas.status": 'accepted')
    .map{|a| a.sima}

答案 3 :(得分:0)

我理解你的上述所有陈述。最终用户我们传递了帐户ID,您也希望从最终用户那里获取sima状态。

您可以先从帐户中归档所有用户ID。然后找到属于该用户的sima,在这里你也可以传递sima状态。

@aBadAssCowboy给出了正确答案,这是第一个答案。但是根据该查询,您将获得所有Sima无或有价值。

user_ids = User.where(primary_partner_id: params[:account_id]).pluck(:id)
Sima.where(user_id: user_ids, status: params[:status]).reject{ |e| e.to_s.empty?}

希望这会对你有所帮助。

答案 4 :(得分:0)

User.preload(:sima).joins(:sima).where(sima: {status: params[:status]}, primary_partner_id: params[:account_id]).map(&:sima)

由于帐户与用户的关系已定义,您可以直接执行...

Account.find(2).users.preload(:sima).joins(:sima).where(sima: {status: params[:status]}).map(&:sima)

答案 5 :(得分:0)

如果您添加到Sima模型 belongs_to :user您可以获取Sima的列表 Sima.joins(:users).where(users: { primary_partner_id: 2 }).where(status: 'accepted')