【问题标题】:Rails 4 Join QueryRails 4 加入查询
【发布时间】:2014-10-21 05:44:10
【问题描述】:

我正在 Rails 4 上构建一个市场应用程序。我有一个卖家小部件,它在我们的平台上显示随机卖家列表。有时,卖家的列表会过期,因此他们没有任何待售物品。我想排除这些卖家出现在小部件中。

我有一个用户模型(用户可以是买家或卖家)。卖家有个人资料描述和图片,而买家没有。因此,要创建小部件,我使用以下查询。

<% User.where("profileimage_file_name != ? AND profilestory != ?", "", "").order("random()").limit(12).each do |user| %>
#some code to link to seller page
<% end %>

我有一个列表模型,它存储所有产品列表并有一个 user_id 作为外键。

用户模型没有任何列表数据。如何编写查询,以便我可以将用户模型与列表模型连接起来,并且只显示至少有 1 个列表处于活动状态的用户。

【问题讨论】:

  • 您使用的日期字段包含列表的到期日期,对吗?
  • 不,我有一个过期方法,它计算创建日期前 30 天。
  • 抱歉之前?你是说之后
  • 例如,如果我在查询列表模型,我会做&lt;% @listings.not_expired.where(...
  • 明白了。您使用的是哪个 DBMS(mysql、postgres 等)?

标签: ruby-on-rails


【解决方案1】:

有几种方法可以做到这一点:

@sellers = User.where("profileimage_file_name != ? AND profilestory != ?", "", "").
                joins(:listing).
                where("listings.created_at <= (created_at + INTERVAL 30 day) ").
                order("random()").limit(12)

更清洁的方式:

class User < ActiveRecord::Base
    default_scope -> { order("random()")} # this is optional
    scope :sellers, -> { where("profileimage_file_name != ? AND profilestory != ?", "", "") }
    scope :with_active_listings, -> { joins(:listing).where("listings.created_at <= (created_at + INTERVAL 30 day) ")}

    ...
end

然后简单地说:

@sellers = User.sellers.with_active_listings.limit(12)

这些有点笼统,并对您的系统做了一些假设,但希望它足够有意义。让我知道这是否有帮助。

【讨论】:

  • 注意: 我在看到您使用 sqlite 之前发布了此内容。 INTERVAL 部分在该 dbms 中不存在。问题是需要使用我展示的方式在DB中进行计算,而不能使用您提到的rails方法。
  • 没关系。我得到了基本的语法。我会从这里弄清楚。
  • @Paul_Richter 我正在使用您在上面发布的查询,但我得到了重复。如何插入distinct User 过滤器?
  • @Moosa 尝试将.uniq 放在查询末尾,应该可以。
  • @Moosa 记住了,你也可以在末尾追加.group(:id)。两者都应该同样好用,唯一的区别在于如果您使用的是聚合,或者可能是子查询。
猜你喜欢
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
相关资源
最近更新 更多