2011-01-14 45 views
1

我有一個結構,它是不是一個真正的has_many :through例子,但我想它表現得像一個:的has_many:通過當連接表中不包含FK兩個表

# user.rb 
belongs_to :blog 
has_many :posts 

# post.rb 
belongs_to :user 

# blog.rb 
has_many :users 
has_many :posts, :through => :users # this obviously doesn't work becase 
            # both FKs aren't in the blogs table 

我想獲取數組中博客的所有帖子。我知道我可以用Ruby來做到這一點,使用each或喜歡collect,但我想讓SQL來完成這項工作。

有人能解釋一下,我可以如何設置我的模型,讓我可以使用SQL和Ruby來調用@ blog.posts,並解釋哪種方式更「好」?

編輯:

我知道在SQL我可以寫這樣的:

SELECT * FROM posts WHERE posts.user_id IN (
    SELECT users.id FROM users WHERE users.blog_id = 7 
) 

這顯然表明,需要兩個查詢。我不認爲這是可能的與join,但我不完全確定。很明顯,需要一個子查詢,但我如何獲得rails來使用ARel構建子查詢,而不必返回並使用Ruby進行循環和收集等等。

回答

2

嘗試把這個在您的Post模型

scope :for_blog, lambda{|blog| 
    where("user_id IN (SELECT u.id FROM users u WHERE u.blog_id = ?)", blog.id) 
} 

這將允許你打電話Post.for_blog(@blog)。 SQL返回的對象必須被賦值爲Post(這就是爲什麼我會將範圍放在Post模型中)。

然後,在你Blog模型,把

def posts 
    Post.for_blog(self) 
end 

通過定義虛擬屬性,你現在應該能夠通過@blog.posts訪問博客帖子。

+0

這個工作,如果我訪問其他關係的職位?就像我需要做post.versions(另一張桌子)和其他東西.. – sethvargo 2011-01-14 03:01:19

相關問題