需要Rails中SQL连接的帮助

时间:2010-01-16 23:06:35

标签: sql ruby-on-rails join thinking-sphinx

我有一个表博客通过user_id属于User。

我正在使用思考sphinx来索引博客,但我只希望它能为用户当前处于活动状态的博客编制索引(user.status = User :: ACTIVE)。

我有以下代码来创建索引,但我知道'where'子句是错误的。它应该是什么?

define_index do
    indexes title
    indexes body

    where "user.status = '#{User::ACTIVE}'"
end

更新: 据我所知,where方法只是将SQL代码传递给数据库引擎。看起来这应该是通过传入JOIN的代码来实现的,但是我不知道自己有多少SQL来创建JOIN语句。

第二次更新: 使用SQL时,似乎JOIn必须在WHERE之前运行,因此除非有人知道更好,否则无法使用SQL代码执行此操作。

4 个答案:

答案 0 :(得分:1)

也许你应该尝试用户(表名是复数)

define_index do
    indexes title
    indexes body

    # Use this line, if status is numeric
    where "users.status = #{User::ACTIVE}"

    # ... and this one, if it's a string
    where "users.status = '#{User::ACTIVE}'"
end

毕竟,您可能需要查看manual

答案 1 :(得分:0)

我对狮身人面像知之甚少,但只是在黑暗中试一试......

users.status = '#{User::ACTIVE}'

答案 2 :(得分:0)

您可能只需要一个虚拟属性来确保思考sphinx加入博客和用户表。如果不知道模式的细节,请尝试以下方法:

define_index do
    indexes title
    indexes body
    has user(:id), :as => :user_id

    where "users.status = '#{User::ACTIVE}'"
end

答案 3 :(得分:0)

我不相信where子句支持这一点。它在幕后添加了SQL,但它无法访问Rails关联。另一种方法是为您的博客记录提供一个状态字段,这取决于用户。

首先,在博客表中添加状态字段。然后,将其添加到您的用户模型:

before_save :update_blog_status

protected

def update_blog_status
  self.blog.update_attribute(:status, self.status)
end

这会自动更新您的博客状态。我不知道一个用户是否有多个博客,所以如果是这样的话,只需相应地调整这个代码。

然后使用适当的where子句更新博客索引器:

define_index do
  indexes title
  indexes body

  where "status = '#{User::ACTIVE}'"
end

这应该是你所需要的:)