gpt4 book ai didi

ruby-on-rails - 如何为多态关联执行稍微复杂的 ActiveRecord 范围查询?

转载 作者:行者123 更新时间:2023-12-01 07:57:04 27 4
gpt4 key购买 nike

所以,我有一个多态的 Notification 模型,我希望能够过滤掉属于 notifiable_type Comment 其中 comment.user == current_user。换句话说,我想要所有通知记录——除了引用当前用户发表的评论的记录。

class Notification

belongs_to :notifiable, :polymorphic => true

scope :relevant, lambda { |user_id|
find(:all, :conditions => [
"notifiable_type != 'Comment' OR (notifiable_type = 'Comment' AND " <<
"comments.user_id != ?)",
user_id ],
:include => :comments
)
}

end

我不明白的是我需要做什么才能访问评论?我需要告诉 ActiveRecord 在 notifiable_id 上加入评论模型。

最佳答案

首先,带参数的 lambda 作用域已被弃用。改用类方法:

class Notification
belongs_to :notifiable, polymorphic: true

def self.relevant(user_id)
# ...
end
end

我通常将范围函数移动到它们自己的模块中,但您可以将其留在那里。

接下来,find(:all):conditions 都被弃用了。我们使用 ActiveRelation queries现在。

不幸的是,ActiveRecord::Relation API 不够健壮,无法满足您的需求,因此我们不得不转而使用 ARel。有点棘手,但出于安全原因,您绝对不想进行字符串替换。

class Notification
belongs_to :notifiable, polymorphic: true

def self.relevant(user_id)
n, c = arel_table, Comment.arel_table
predicate = n.join(c).on(n[:notifiable_id].eq(c[:id]))

joins( predicate.join_sql ).
where{ ( notifiable_type != 'Comment' ) |
(( notifiable_type == 'Comment' ) & ( comments.user_id == my{user_id} ))
}
end
end

我正在使用 ARel 和 Squeel 的组合这里。 Squeel 非常好,应该成为 Rails 的核心功能。我尝试在没有 Squeel 的情况下编写那个 where 子句,但是太难了我放弃了。

如果没有您的项目,很难测试这样的东西,但希望这至少能让您更接近。

关于ruby-on-rails - 如何为多态关联执行稍微复杂的 ActiveRecord 范围查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7588323/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com