我的代码是这个
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(',')}")
我花了很多时间我可以使用加入来做到这一点吗
谢谢
我的代码是这个
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(',')}")
我花了很多时间我可以使用加入来做到这一点吗
谢谢
你应该这样做
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"
不幸的是,您不能在同一个活动记录查询中执行“包含”和“选择”。所以这行不通...
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')
可能很好