我有一個數據庫Item
s。每件商品belongs_to
a User
。每個項目有一個visibility
和status
字段。爲了搜索,一個項目必須滿足下列規則:如何使用activerecord在rails中正確寫入複雜的where子句?
status must be :available
AND
(visibility must be :everyone
OR
(visibility must be :friends AND user_id must be in current_user.friends)
)
換句話說,你可以看到所有可用的公共物品,你可以看到你朋友的「私人」物品。
如何檢索出符合此條件的物品?
我曾嘗試以下:
class Item < ActiveRecord::Base
belongs_to :user
attr_accessible :description, :photo, :title, :user_id, :visibility
#...
scope :searchable, lambda { |user|
where('status IN ? AND (visibility IN ? OR (visibility IN ? AND user_id IN ?))',
[:available, :lent],
[:everyone],
[:friends],
user.friends)
}
end
而且在我的控制器:
@items = Item.searchable(current_user)
但我有一個錯誤:
周圍沒有括號所產生條款
ActiveRecord::StatementInvalid in Items#search
SQLite3::SQLException: near ",": syntax error: SELECT "items".* FROM "items" WHERE (status IN 'available','lent' AND (visibility IN 'everyone' OR (visibility IN 'friends' AND user_id IN 'foo')))
如果您手動添加圓括號,該怎麼辦? ''where('status IN(?)...' – MurifoX 2013-03-18 11:45:13
另外,爲什麼我不能用'do'來代替lambda的{{'| – 2013-03-18 11:50:21
我相信這是一種慣例,我從來沒有見過ActiveRecord作用域與do ... end lambda塊 – MurifoX 2013-03-18 11:55:44