在rails中的select和group中转换查询

时间:2015-02-27 12:54:20

标签: ruby-on-rails postgresql

我正在学习join表查询生成。我可以在没有使用关联的join表的情况下实现我的目标。但现在我的问题是如何才能获得与使用joinselectgroup相同的结果?

型号:

class User < ActiveRecord::Base
  has_many :messsages         
end

class Messsage < ActiveRecord::Base
  belongs_to :user
end

表格结构:

#users : id , first_name , last_name
#messages: id, subject , description , sender_id, recipient_id

控制器:

 @messsages = Messsage.where(recipient_id: current_user.id)
 @sender_list = @messsages.group(:sender_id).count
 => Expected correct output: {1=>1, 2=>1, 3=>2, 4=>3} #getting as result 

通过这个我从哪个sender_id得到了多少消息。我正在使用PostgreSQL

我的尝试:

@sender_list = Messsage.joins(:user).select("users.id, users.first_name").group("users.id , messsages.sender_id")

错误:

PG::UndefinedColumn: ERROR:  column messsages.user_id does not exist
LINE 1: ... "messsages" INNER JOIN "users" ON "users"."id" = "messsages...
                                                             ^
: SELECT users.id, users.first_name FROM "messsages" INNER JOIN "users" ON "users"."id" = "messsages"."user_id" GROUP BY users.id , messsages.sender_id

更新

我也更新了我的表单代码,因此您可能有更好的想法:

<%= form_for(@messsage) do |f| %>
  <div class="field">
    <%= f.label :sender_id %><br>
    <%= f.collection_select :sender_id, User.all, :id, :id  %>
  </div>
  <div class="field">
    <%= f.label :subject %><br>
    <%= f.text_field :subject %>
  </div>
  <div class="field">
    <%= f.label :description %><br>
    <%= f.text_area :description %>
  </div>
  <div class="field">
    <%=  f.hidden_field :recipient_id , :value => current_user.id %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

页面截图: enter image description here

1 个答案:

答案 0 :(得分:0)

写作时

class Messsage < ActiveRecord::Base
  belongs_to :user
end

Rails期望messages表格有一个user_id字段,但它没有,而是sender_idrecipient_id,所以要制作轨道明白这一点你需要稍微修改一下模型

class Messsage < ActiveRecord::Base
  belongs_to :recipient, class_name: 'User'
  belongs_to :sender, class_name: 'User'
end

现在Message有一个senderrecipient

我们也可以更新User模型,以了解已发送消息和已接收消息之间的区别。

class User < ActiveRecord::Base
  has_many :sent_messages, class_name: 'Message', foreign_key: :sender_id
  has_many :received_messages, class_name: 'Message', foreign_key: :recipient_id
end

然后您的查询可能类似

current_user.received_messages.group(:sender_id).count