1

我的代码是这个

contact = UserContact.find(:all,:select=>"distinct app_id,number",:conditions=>"number ='1234'")

arr=[]
contact.each do|c|
 arr << c.app_id
end
name=User.find(:all,:conditions=>"id in(#{arr.join(',')}")

我花了很多时间我可以使用加入来做到这一点吗

谢谢

4

2 回答 2

0

你应该这样做

User.find(:all, :joins => :user_contacts, :conditions => "user_contacts.number = '1234'")

用户应该有关联。在 user.rb 中应该是:

has_many :user_contacts, :foreign_key => :app_id

但是将列命名为“app_id”是不好的风格,它应该是“user_id”(约定优于配置)。将其重命名。重命名后,您可以删除 ", :foreign_key => :app_id"

于 2013-05-18T07:22:27.173 回答
0

不幸的是,您不能在同一个活动记录查询中执行“包含”和“选择”。所以这行不通...

contacts = UserContact.includes(:users).where("number = ?", '1234').select(:app_id, :number).uniq

但。

第一:app_id 看起来应该叫做“user_id”

第二:你使用的是什么版本的 Rails?如果您使用的是 rails 3.2,您可能需要使用“pluck”方法。因此

user_ids = UserContact.where("number = ?", '1234').pluck(:app_id).uniq
users = User.where(:id => user_ids)

第三:在红宝石中而不是这样做:

arr=[]
contact.each do|c|
  arr << c.app_id
end

做这个:

arr = contact.inject([]) {|arr, c| arr << c.app_id}

第四:在我的所有示例中,您的语法主要是 Rails 2。我假设您使用的是 rails 2?如果是这样,您可能需要升级。

第五:如果您返回多个对象,请使用复数变量名。因此

 contact = UserContact.....
 name=User.....

应该

 contacts = UserContact.find.....
 users = User.find.....

最后的:

  User.joins(:user_contacts).where("user_contacts.number = ?", '1234')

可能很好

于 2013-05-18T07:23:34.013 回答