我希望给我的应用程序用户提供机会从他们的微博中删除不想要的微博。默认情况下,微博包括用户自己的微博和所关注用户的微博:
def feed
following_ids = "SELECT followed_id FROM relationships
WHERE follower_id = :user_id"
Micropost.where("user_id IN (#{following_ids})
OR user_id = :user_id", user_id: id)
end
我创建了一个名为Quarantine
的模型,将用户和不需要的微博关联起来。然后我查找了一个ActiveRecord::Relation
方法,允许我从上述where
中减去以下where
:
microposts_ids = "SELECT micropost_id FROM quarantines
WHERE user_id = :user_id"
Micropost.where("micropost_id IN (#{microposts_ids})", user_id: id)
我找不到对应于-
数组操作符的任何方法。但是我在一个 Stackoverflow 的问题中找到了merge
方法:合并两个 ActiveRecord::Relation 对象,据我所知,这将允许我像下面这样链接wheres
:
Micropost.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id).merge(Micropost.where.not("micropost_id IN (#{microposts_ids})", user_id: id))
区别在于我将第二个
where
改为了where.not
。这种解决方案的问题是,
where.not
会加载所有未被隔离的微博,这对数据库来说比仅加载被隔离的微博更加繁重。是否有其他替代方法可以使用,例如从原始动态中减去被隔离的微博的方法?
user_id
和micropost_id
。然而,Micropost.joins(:quarantines)
是一个Micropost对象,而不是Quarantine对象,这就是为什么Active Record会抱怨:Micropost对象没有user_id
列:ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column microposts.user_id does not exist
。 - AsarluhiActiveRecord::StatementInvalid:PG :: UndefinedColumn:ERROR:column quarantines.user_id 不存在
或ActiveRecord::StatementInvalid:PG :: UndefinedColumn:ERROR:column microposts.user_id 不存在
- moyinho20