【发布时间】:2014-03-15 02:50:16
【问题描述】:
我有一个名为Block 的模型,它有一个blocker_id(一个user_id)和一个blocked_user_id 字段(也是一个user_id)。 Block 模型允许一个用户阻止另一个用户。当一个用户阻止另一个用户时,我希望它使用Block 类的before_save 方法来破坏他们之间的Relationship。 Relationship 表有一个follower_id 和一个followed_id。
这就是事情变得棘手的地方。我知道我可以通过使用多个return if Relationship.xyz.nil? 语句然后使用多个Relationship.find_by(follower_id: , followed_id: ).destroy 语句来实现这个目标,但这变得过于复杂,因为每个blocker 和blocked_user 都可以是follower 和@987654336 @id,两者都有,或者两者都没有。有没有更简单的方法来做到这一点?
这是我的模型供参考:(Block 类也有一个 blocked_post 字段,我对此没有任何问题)
class Block < ActiveRecord::Base
validates :blocker_id, presence: true
validates :blocked_user_id, uniqueness: {scope: :blocker_id}, allow_nil: true
validates :blocked_post_id, uniqueness: {scope: :blocker_id}, allow_nil: true
validate :blocked_user_or_post
after_validation :validate_block
before_save :destroy_blocked_relationships
belongs_to(
:blocker,
class_name: "User"
)
has_one(
:blocked_user,
class_name: "User"
)
has_one(
:blocked_post,
class_name: "Post"
)
private
def blocked_user_or_post
blocked_user_id.blank? ^ blocked_post_id.blank?
end
def validate_block
if blocked_user_id.present?
!(blocker_id == blocked_user_id)
elsif blocked_post_id.present?
blocked_post = Post.find_by(id: self.blocked_post_id).user_id
!(blocker_id == blocked_post)
else
false
end
end
def destroy_blocked_relationships
#my over-complex code was here
end
end
relationship.rb:
class Relationship < ActiveRecord::Base
validates :follower_id, :followed_id, presence: {message: 'Need an eligible follower and followee id'}
validates :followed_id, uniqueness: { scope: :follower_id}
belongs_to(
:follower,
class_name: "User"
)
belongs_to(
:followed,
class_name: "User"
)
end
如果有任何不需要大量代码的方法来做到这一点,我真的很想知道。提前致谢。
【问题讨论】:
-
在这一行中,您是不是要为变量命名其他名称?
blocked_post = Post.find_by(id: self.blocked_post_id).user_id
标签: ruby-on-rails ruby callback associations