在Rails 4

时间:2015-06-13 07:10:50

标签: ruby-on-rails ruby sqlite join activerecord

所以,我已经阅读了相当多的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中非常简单。所有帮助表示赞赏。

提出查询的其他要点,可让我查看我作为用户创建和喜欢的所有帖子!

1 个答案:

答案 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)。