[英]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.