0

我已经建立了一个用户和朋友关系模型,但问题是通过这些关联我可以成为自己的朋友。我已经在我的视图和控制器中成功地抑制了它,但从逻辑上讲,它应该在模型中被抑制,因为我仍然可以从我想要避免的控制台创建友谊。

用户模型

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

用户友谊模型

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

其他一切都像添加,阻止,删除,请求朋友一样完美运行我的模型的唯一问题是我也可以自己加好友,这是我想避免的。

4

3 回答 3

0

这个问题有点问题,因为我们想要保持 RESTful,分离不同的任务(MVC),并考虑到奇怪的竞争条件(线程安全)。

尝试使用验证#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 回答
0

您可能想要进行验证

validate :cannot_friend_self

def cannot_friend_self
  current_user.id != friend.id
end

此代码可能不是您想要的,但应该为您指明正确的方向。

完整指南在这里http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-methods

于 2013-05-31T05:41:04.460 回答
0

将验证添加到UserFriendship

validate :cannot_friend_self

def cannot_friend_self
  errors.add(:friend_id, "cannot friend self") unless user_id != friend_id
end
于 2013-05-31T06:49:23.393 回答