所以,我已经阅读了相当多的rails活动记录页面,堆栈O问题和答案(大约12小时的时间)试图弄清楚如何将所有这些事物组合成一个单独的查询来显示它们在我的页面上。
这是我的页面视图
Secrets with owner info
</h3>
<% @secretInfo.each do |i| %>
<p><%= i.content %> - <%= i.first_name %></p>
<p><%= i.created_at %></p>
--> "this is where I'd like to have likes for post" <--
<% end %>
这是我的控制器
def show
@user = User.find(params[:id])
@secrets = Gossip.all
@mySecrets = Gossip.where(user_id: [params[:id]])
@secretInfo = Gossip.joins(:user).select("content", "first_name", "created_at")
@secretWLikesNInfo = WTF MATE?
end
此外,可能有助于查看我的模型和架构,所以这里是那些
class User < ActiveRecord::Base
attr_accessor :password
has_many :gossips
has_many :likes
has_many :liked_secrets, :through => :gossips, :source => :gossip
class Like < ActiveRecord::Base
belongs_to :user
belongs_to :gossip
class Gossip < ActiveRecord::Base
belongs_to :user
has_many :likes
has_many :liking_users, :through => :likes, :source => :user
我不知道为什么这看起来如此不可能,或者它可能是一个非常简单的东西,我只是在俯视。这在PHP / MySQL中非常简单。所有帮助表示赞赏。
提出查询的其他要点,可让我查看我作为用户创建和喜欢的所有帖子!
答案 0 :(得分:0)
那么,您想要做的是急切加载:将与单个往返中的记录关联的数据加载到数据库。例如,我认为您可以加载所有数据:
@user = User.where(id: params[:id])
.joins(:liked_secrets)
.includes(:liked_secrets => :likes)
.first!
@secretInfo = @user.liked_secrets.map do |secret|
OpenStruct.new(
content: secret.content,
first_name: user.first_name,
created_at: secret.created_at,
likes: secret.likes
)
end
这通过在第一个查询中从数据库中提取的数据中包含include
参数中包含的所有相关数据来工作。因此,调用@user.liked_secrets
将返回秘密,但不会调用数据库,因为该信息已经来自第一个查询中的数据库。如果由于初始查询中的@user.liked_secrets.first.likes
参数而执行:linked_secrets => :likes
,则会发生同样的情况。
我在此处链接到一篇关于此的好文章: http://blog.arkency.com/2013/12/rails4-preloading/。
而且,如果您认为Rails ORM(ActiveRecord)并不适用于您的用例,您可以在字符串或后备中使用sql以使用其他Ruby ORM(如Sequel)。