在這樣一個領域:如何篩選用於association_ids ActiveRecord模型?
class User
has_many :posts
has_many :topics, :through => :posts
end
class Post
belongs_to :user
belongs_to :topic
end
class Topic
has_many :posts
end
我可以通讀user.topic_ids
所有的主題ID,但我看不到的方式來過濾條件適用於這種方法,因爲它返回一個Array
而不是ActiveRecord::Relation
的。
問題是,給定一個用戶和一個現有的主題,標記用戶有一個帖子。我目前正在做這樣的事情:
def mark_topics_with_post(user, topics)
# only returns the ids of the topics for which this user has a post
topic_ids = user.topic_ids
topics.each {|t| t[:has_post]=topic_ids.include(t.id)}
end
但是,這加載所有主題id,無論輸入集。理想情況下,我想這樣做
def mark_topics_with_post(user, topics)
# only returns the topics where user has a post within the subset of interest
topic_ids = user.topic_ids.where(:id=>topics.map(&:id))
topics.each {|t| t[:has_post]=topic_ids.include(t.id)}
end
但我可以具體做的唯一事情就是
def mark_topics_with_post(user, topics)
# needlessly create Post objects only to unwrap them later
topic_ids = user.posts.where(:topic_id=>topics.map(&:id)).select(:topic_id).map(&:topic_id)
topics.each {|t| t[:has_post]=topic_ids.include(t.id)}
end
有沒有更好的辦法? 是否有可能有一些像select_values
在協會或範圍是什麼? FWIW,我在軌道上3.0.x的,但我很好奇3.1了。
我爲什麼這樣做呢?
基本上,我有一個半複雜搜索的結果頁面(它僅基於主題數據發生),並且我想將結果(主題)標記爲用戶已經交互的東西(寫入了帖子)。
所以是的,還有另一個選項可以做一個連接[主題,發佈],以便結果從搜索中標記出來,但是這會破壞我緩存Topic查詢的能力(查詢,即使沒有加入,也比僅爲用戶獲取ID更昂貴)
注意上面概述的方法做的工作,他們只是覺得不理想。
也許你可以描述爲什麼你在做什麼你在做。有時候抽象化會揭示需求的簡化(士力架vs比利時巧克力)。 – clyfe 2011-12-22 09:36:32
true,添加了一個關於它的塊 – riffraff 2011-12-22 09:44:25