0

これは、私が以前に抱えていた問題からの更新された質問です。私は、ユーザーと犬がプロフィールを持っている、地元の犬の養子縁組のための「match.com」スタイルのアプリを作成しています。各プロファイルには、ブールフィールドがあります。ユーザープロファイルに一致する犬のみをエンドユーザーに表示しようとしています。ただし、ユーザーのブール値に応じてロジックが変わるため、単純な1対1の一致は機能しません。たとえば、ユーザーに子供がいる場合(user.kids_under_10:true)、子供と一緒に配置できる犬(dog.kids_under_10:true)と単純に一致させます。モデルは次のようになります

class Dog < ActiveRecord::Base

def self.by_profile(user)
  if user.kids_under_10 == true
    Dog.where(kids_under_10: user.kids_under_10)
  end
end

ただし、ユーザーに子供がいない場合は、この質問に正誤の両方で答える犬を表示できます。これは、子供に優しい犬とそうでない犬をこのユーザーと一緒に配置できるためです。else, Dog.allこれが一致の唯一の基準である場合、上記のメソッドにステートメントを追加するだけでよいことに気付きました。ただし、一致する他のブールフィールド(つまり、user.has_catsとdog.cat_friendly)があるため、このソリューションは機能しません。ここに配列を含む変数が必要だと思いますが、実際にはわかりません...提案があります。

4

3 に答える 3

1

次のようなものを使用してみてください。

class Dog < ActiveRecord::Base
  def self.by_profile(user)
    dogs = scoped

    dogs = dogs.where(kids_under_10: true) if user.kids_under_10
    dogs = dogs.where(cat_friendly: true) if user.own_cats
    # other conditions

    dogs
  end
end

基本的に、このscopedメソッドは空の関係を提供します。次に、それを使用して、条件付きでwhereステートメント(またはARがサポートするその他のもの)を追加できます。

于 2012-12-22T22:21:56.593 に答える
0
def self.by_profile(user)
  user.kids_under_10 ? Dog.where(kids_under_10: true) : Dog.all
end

あまりエレガントではありませんが、機能するはずです。

于 2012-12-22T23:35:00.887 に答える
0

だから私は解決策を見つけましたが、それが最も効率的な解決策であるかどうかはわかりませんので、どんな提案も大歓迎です(私はプログラミングに不慣れで、さまざまな状況を処理するための「最良の」方法を学びたいと思っています)。これが私が問題を解決した方法です:

class Dog < ActiveRecord::Base

def self.by_profile(user)
  if user.kids_under_10?
    kids_under_10 = true
  else
    kids_under_10 = [true, false]
  end

  Dog.where(kids_under_10: kids_under_10)
end
end

パラメータを追加すると、このソリューションが少し面倒になることが予想されます。条件文はかなり長くなる可能性があります。提案をありがとう!

于 2012-12-22T22:15:21.960 に答える