我正在学习join
表查询生成。我可以在没有使用关联的join
表的情况下实现我的目标。但现在我的问题是如何才能获得与使用join
,select
和group
相同的结果?
型号:
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 %>
页面截图:
答案 0 :(得分:0)
写作时
class Messsage < ActiveRecord::Base
belongs_to :user
end
Rails期望messages
表格有一个user_id
字段,但它没有,而是sender_id
和recipient_id
,所以要制作轨道明白这一点你需要稍微修改一下模型
class Messsage < ActiveRecord::Base
belongs_to :recipient, class_name: 'User'
belongs_to :sender, class_name: 'User'
end
现在Message
有一个sender
和recipient
。
我们也可以更新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