2011-03-16 115 views
1

我試圖創建Rails 3模型的範圍,這一點,主要有:SQL或範圍3 /阿雷爾

scope :published, where(:published => true) 

scope :viewable_by, lambda { |user| where(:user_id => user.id).or(published) } 

麻煩的是,我無法找到一種方法,使這個工作。

我曾希望arel_table會的工作,但它會抱怨「無法訪問的ActiveRecord ::關係」:

where(arel_table[:user_id].eq(user.id)).or(published) 

這可以通過複製「出版的」範圍爲阿雷爾進行,但是隨後我會重複代碼(在我的項目「上發表」範圍是相當多的深度)。

我能想出的最好的是這樣的:

scope :viewable_by, lambda { |user| where("(user_id = ?) OR (#{published.where_values.collect(&:to_sql).join(" AND ")})", user.id) } 

回答

0

這是一個有點四處之後我可以想出最短:

scope :published, where(:published => true) 
scope :viewable_by, lambda { |user| where("user_id = ? OR #{published.where_clauses.first}", user.id) } 

(當然,這只是工作如果有多個條目,則使用join。)

我會推薦使用像MetaWhere這樣的寶石,它可以更清楚地顯示一些Arel unde rpinnings。下面是上面鏈接的主頁的例子創建或查詢:

Article.where(:title.matches % 'Hello%' | :title.matches % 'Goodbye%').to_sql 
=> SELECT "articles".* FROM "articles" WHERE (("articles"."title" LIKE 'Hello%' 
    OR "articles"."title" LIKE 'Goodbye%'))