2011-01-07 30 views
14

使用。凡方法我剛剛開始使用。凡方法,我有點困惑如何充分利用它。在Rails3中

我想這樣做:

@books = Book.where(:author_id => 1 || 2) 

清楚我知道這是不行的,但我想證明,我想在這裏一些額外的邏輯。一些「或」「和」「不等於」等

爲在那裏我可以研究這個任何想法?我正在尋找rails API,但我沒有看到任何有用的東西。

謝謝!

回答

26
因爲表達是在函數調用前評估

1 || 2是不行的(它的計算結果爲1,所以它應該相當於Book.where(:author_id => 1)我會做:。

@books = Book.where(:author_id => [1, 2]) 

生成的SQL是WHERE author_id IN (1, 2)

+0

嘿凸輪,這真是棒極了的感謝!關於如何使用where或者其他方法來實現「and」或「不等於」類型邏輯的任何想法? – Elliot

+0

嘿埃利奧特,不幸的是,哈希參數'where'不支持「不等於」類型的查詢(見http://guides.rubyonrails.org/active_record_querying.html「只有平等,範圍和子集檢查是可能的散列條件「)。就「和」查詢而言,只需在你的散列中添加另一個鍵:'Book.where(:author_id => [1,2],:bestseller => true)'將編譯爲'WHERE author_id IN(1, 2)AND暢銷書是真)' – cam

+0

它應該如何修改爲mongoid –

3

查看源(!沒有什麼像樣的文檔),你可以通過SQL,可以設定參數的sql爲:條件等,所以你可以這樣做:

@books = Book.where("author_id = 1 OR author_id = 2") 

不理想的下降到原始SQL,但我看不到一個更優雅的方式來使用where方法。

Source and absence of documentation here

+0

我會做'@books = Book.where( 「AUTHOR_ID =?OR AUTHOR_ID =?」,1,2)' – DemitryT

1

這聽起來像你可能想看看阿雷爾更復雜的事情。它已經內置於Rails 3(AR在內部使用它)。

book = Book.arel_table 
# range 
Book.where(book[:author_id].gt(0).and(book[:author_id].lt(3)) 

#or 
Book.where(b[:author_id].eq(0).or(t[:author_id].eq(3).order(:first_name)) 

#joins 
book.join(authors).on(book[:author_id].eq(author[:id])). 
    where(book[:title].matches 'hokum n stuff') 

還分組,聚合等等。缺點是文檔很少。 docs

tests