0

ユーザーと友達の関係モデルを構築しましたが、問題は、それらの関連付けで自分自身を友達にできることです。ビューとコントローラーでそれをうまく抑制しましたが、回避したいコンソールから友情を作成できるため、論理的にはモデルで抑制する必要があります。

ユーザーモデル

has_many :user_friendships
has_many :friends, through: :user_friendships,
                conditions: { user_friendships: { state: 'accepted' } }

User_friendship モデル

belongs_to :user
belongs_to :friend, class_name: 'User', foreign_key: 'friend_id'

追加、ブロック、削除、友達のリクエストなど、他のすべてが完全に機能しています。私のモデルの唯一の問題は、避けたい自分自身も友達になることができることです。

4

3 に答える 3

0

RESTful を維持し、さまざまなタスク (MVC) を分離し、奇妙な競合状態 (スレッド セーフティ) を考慮したいため、この問題は少し問題があります。

validations#exclusions を使用してみてください ( http://guides.rubyonrails.org/active_record_validations_callbacks.html#exclusion )

class ApplicationController < ActionController::Base
  ...
  before_filter do |c|
    User.current_user = User.find(c.session[:user]) unless c.session[:user].nil?  
  end
  ...
end

class User < ActiveRecord::Base
  ...
  cattr_accessor :current_user
  ...
end

class Friends < ActiveRecord::Base
  ...
  validates :friend_id, :exclusion => { :in => %w(User.current_user.id),
  :message => "I don't think you really want to friend yourself" } 
  ...
end

安全を確保したい場合は、( http://nhw.pl/wp/2011/11/30/passing-current-user-id-to-rails-models )を参照してください。

免責事項

  • 私はそれをテストせずにこの可能な解決策を書きました(別名、ほとんど参照せずに薄い空気から引き出しました)
  • Ruby on Rails でスレッド化したことがありません。
于 2013-05-31T04:50:14.853 に答える