簡體   English   中英

在Rails 3 / Arel中的作用域中的SQL OR

[英]SQL OR in scopes in Rails 3 / Arel

我正在嘗試創建一個Rails 3模型范圍,本質上是:

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

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

麻煩的是,我找不到使這項工作可行的方法。

我曾希望arel_table可以工作,但是它抱怨“無法訪問ActiveRecord :: Relation”:

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

這可以通過將“已發布”作用域復制為Arel來完成,但隨后我將重復代碼(在我的項目中,“已發布”作用域的深度要大得多)。

我能想到的最好的方法是:

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

經過一番挖掘,這是我能想到的最短的方法:

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

(當然,它僅適用於單個where子句;如果有多個,則使用join 。)

我建議使用像MetaWhere這樣的寶石, 可以更清楚地揭示Arel的某些基礎。 這是上面鏈接的主頁中創建OR查詢的示例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM