2

私はトリッキーな挑戦に立ち向かっています。私が実現しようとしていることを説明しましょう。ユーザーが 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(user)メソッドを作成したことがわかりますが、信じられないほど非効率的だと思います。コンソールから実行すると機能しますが、任意の形式 (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
4

1 に答える 1

2

そのようなものはどうですか:

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

& 演算子は、単純に 2 つの配列の交点を返します。

于 2013-01-23T15:34:17.027 に答える