0

s のデータベースがありますItem。各アイテムbelongs_to_ User各項目にはvisibilityandstatusフィールドがあります。検索可能にするには、アイテムが次のルールを満たしている必要があります。

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)

しかし、私はエラーがあります:

IN で生成された句の周囲に括弧はありません

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')))
4

3 に答える 3

4

個人的には、ラムダを使用してスコープよりもクラス メソッドを宣言することを好みます。読みやすいと思います。さらに、デフォルトを設定する方が簡単です。

def self.with_status(statuses)
  where(status: statuses)
end

def self.visible_to_friends_of(user)
  where('visibility = ? OR (visibility = ? AND user_id IN (?))',
    'everyone',
    'friends',
    user.friends
  )
end

def self.searchable(user)
  with_status([:available, :lent]).visible_to_friends_of(user)
end
于 2013-03-18T12:34:22.543 に答える
2

まあ、私はあなたが?sの周りに自分で括弧を入れなければならないことを知りませんでした(あなたが言うように@MurifoX)

scope :searchable, lambda { |user|
    where('status IN (?) AND (visibility IN (?) OR (visibility IN (?) AND user_id IN (?)))',
          [:available, :lent],
          [:everyone],
          [:friends],
          user.friends)
}

この動作を実装するためのより良い方法があれば、私はまだ開いています.

于 2013-03-18T11:48:21.083 に答える
0

これにはthinking_sphinxgemを使用する必要があると思います。

define_index do
indexes title
indexes description
indexes uploads.file_file_name, :as => :upload_file_name
indexes uploads.file_content_type, :as => :upload_file_content_type

has :id
has price
has user_id
has created_at
has purchase_count
has images.photo_file_size
has tags.id, :as => :tag_id, :facet => true
has tags.parent_id, :as => :tag_parent_id, :facet => true
has "state='active'", :as => :active, :type => :boolean, :facet => true
has "count(images.id) > 0", :as => :has_image, :type => :boolean
has "sum(uploads.file_file_size)", :as => :total_size, :type => :integer

where "state in ('active', 'pending')"

set_property :delta => true
set_property :morphology => 'stem_en'
set_property :min_prefix_len => 3
set_property :enable_star    => true

終わり

要件を満たすために、hasconditionまたはwhere句を使用できます。詳細については、ここをクリックしてください

于 2013-03-18T23:09:27.383 に答える