比较Rails中两个数据集的更好方法?

时间:2013-01-23 14:36:08

标签: ruby-on-rails rails-activerecord

我正面临着一个棘手的挑战。让我解释一下我想要实现的目标。如果用户使用Facebook登录我的应用程序,我会抓取他们所有的Facebook朋友UID,并将这些存储为用户的“facebook_friends”。然后,一旦登录,用户就会看到即将发生的事件列表,如果有任何与会者与用户的Facebook好友的UID匹配,我想查看每个事件,并将其突出显示给他们。

我选择按如下方式创建Event.rb模型:

class Event < ActiveRecord::Base

  #  id                  :integer(11)

  has_many :attendances, as: :attendable
  has_many :attendees

  def which_facebook_friends_are_coming_for(user)
    matches = []
    self.attendees.each do |attendee|
      matches << user.facebook_friends.where("friend_uid=?", attendee.facebook_id)
    end
    return matches
  end

end

你可以看到我已经创建了 which_facebook_friends_are_coming_for(用户)方法,但它让我感到非常低效。当我从控制台运行它时,它确实有效,但如果我尝试以任何形式(如YAML)转储它,我会被告知无法转储匿名模块。我认为这是因为现在'匹配'持有人不是这样的类(当它应该是FacebookFriends时)。

必须有更好的方法来做到这一点,我会喜欢一些建议。

作为参考,其他类看起来像这样:

class User < ActiveRecord::Base
  #  id                  :integer(11)

  has_many :attendances, foreign_key: :attendee_id, :dependent => :destroy
  has_many :facebook_friends

end


class FacebookFriend < ActiveRecord::Base
  #  user_id             :integer(11)
  #  friend_uid          :string
  #  friend_name         :string

  belongs_to :user

end


class Attendance < ActiveRecord::Base
  #  attendee_id         :integer(11)
  #  attendable_type     :string
  #  attendable_id       :integer(11)

  belongs_to :attendable, polymorphic: true
  belongs_to :attendee, class_name: "User"

end

1 个答案:

答案 0 :(得分:2)

这样的事情:

def which_facebook_friends_are_coming_for(user)
  self.attendees.map(&:facebook_id) & user.facebook_friends.map(&:friend_uid)
end

&amp; operator只返回两个数组的交集