在Rails 3应用程序中复杂(对我来说)数据库查询

时间:2012-04-30 20:12:27

标签: ruby-on-rails-3

  1. 我们数据库中的一条记录跟踪A人给B人送礼的频率。
  2. 我们数据库中的不同记录跟踪B人向A人赠送礼物的频率。
  3. 另一条记录跟踪人A给人C的内容的频率。
  4. 由于C人从未向A人提供任何内容,因此没有任何记录。
  5. 将该模式乘以A给予和/或接收关系的50个人。
  6. 用户表有'id'和'name'

    礼品表有'giver_id'和'receiver_id'

    profile_pictures有'user_id'和'picture_url'

    用户模型:

    has_one :profile_picture
    has_many :gifts
    

    ProfilePicture:

    belongs_to :user
    

    礼品型号:

    belongs_to :user
    

    我无法从数据库中拔出一次数组。数组需要按名称进行字母顺序排列。我开始时:

    parties = Gift.where("giver_id = ? || receiver_id = ?", current_user.id, current_user.id)
    

    试图倒退。我尝试让所有用户都包含个人资料图片并尝试将他们映射到Gifts数组。我无法做那件事。

    感谢您的帮助。

    更新: 测试数据的当前结果:

    Clower, Steve
    Gallipert, Jay   
    Gallipert, Erin
    Gallipert, Jay   
    Gallipert, Jay
    Gallipert, Linda   
    Gallipert, Jay
    Gallipert, Erin   
    Gallipert, Jay
    Garrent, Kara   
    Gallipert, Jay
    Atkal, Andrew   
    Gallipert, Jay
    Dystrom, Paul   
    Gallipert, Jay
    Clower, Steve   
    Gallipert, Linda
    Gallipert, Jay   
    Garrent, Kara
    Gallipert, Jay   
    

    我需要什么:

    Atkal, Andrew
    Clower, Steve 
    Dystrom, Paul   
    Gallipert, Erin   
    Gallipert, Jay  
    Gallipert, Linda   
    Garrent, Kara   
    

    我想知道这样做的唯一方法是

    1. 将所有名称转储到一个数组
    2. 在Ruby中对数组进行排序
    3. 使用已排序的数组重新查询数据库以获取个人资料照片

1 个答案:

答案 0 :(得分:1)

class Gift
  belongs_to :giver, :foreign_key => "giver_id", :class_name => "User"
  belongs_to :receiver, :foreign_key => "receiver_id", :class_name => "User"
end

gifts = Gift.where("giver_id = :id OR receiver_id = :id",:id => current_user.id).includes(:giver => :profile_picture).order('users.name').includes(:receiver => :profile_picture)
# gifts sorted by giver name
# users and profile picture are included in gifts array

使用示例:

gifts.each do |gift|
  gift.giver.name # giver name
  gift.giver.profile_picture.picture_url # giver picture url
  gift.receiver.name # receiver name
  gift.receiver.profile_picture.picture_url # receiver picture url
end

更新:

测试数据尝试此代码:

gifts = Gift.select('giver_id,receiver_id').uniq.includes(:giver => :profile_picture,:receiver => :profile_picture)
gifts.sort!{|x,y| "#{x.giver.name} #{x.receiver.name}" <=> "#{y.giver.name} #{y.receiver.name}"}
gifts.each{|g| puts "#{g.giver.name}, #{g.receiver.name}"}

输出是:

Atkal, Andrew
Clower, Steve
Dystrom, Paul
Gallipert, Erin
Gallipert, Jay
Gallipert, Linda
Garrent, Kara

不是很优雅,但很快。也许有人帮我们按SQL分类礼物。