关系:
帐户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;
答案 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])
上面会对数据库进行两次打击,但这完全没问题。您可以使用includes
和map
,但我认为这不会带来巨大的性能优势,具体取决于您拥有的帐户中的用户数量。无论如何,这里是:
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')