查找使用:has_many关联和多个条件

时间:2014-03-03 00:14:11

标签: mysql ruby-on-rails ruby ruby-on-rails-3

在我的应用程序中,用户查看我存储在名为View的单独关联表中的Pins。该表具有ID,pin_id,user_id和排名。我想找到符合用户尚未看到的某些标准的针脚。我正在使用Rails 3.2.13。

以下是我的模特协会:

class Pin
has_many :views
has_many :users, :through => :views

class View
belongs_to :pin
belongs_to :user

class User
has_many :pins
has_many :views  
has_many :pins, :through => :views

现在我正在这样做,这有效:

pins_controller.rb

b = TRUE
sex = current_user.sex
views = current_user.views
seen = views.map(&:pin_id)
@pins = Pin.find(:first, :conditions => ["sex = ? AND active = ? AND id not in (?)", sex, b, seen])

我认为使用连接使用单个数据库查询来拉取对象会更优雅。但是,我无法让这个工作。我已经阅读了一些不同的SO文章,但我无法使用单个查询重现上述内容。我是否认为以上是迂回的并且有更好的方法?

3 个答案:

答案 0 :(得分:1)

您应该能够pins加入viewview加入users。我认为以下内容可行,但需要viewusers关联的具体详情:

Pin.joins(:views => :user).where("views.sex = ? and views.active = ? and users.id not in (?)", current_user.sex, true, [current_user.id])

答案 1 :(得分:0)

尝试尖叫它比普通的有效记录查询方法更好,更好,并为您提供更强大的功能

https://github.com/activerecord-hackery/squeel

http://railscasts.com/episodes/354-squeel

答案 2 :(得分:0)

你可以这样做:

Pin.joins(:views).where(sex: sex, active: b).
  merge(View.where(View.arel_table[:user_id].not_eq(current_user.id))).first