10

私はRailsの初心者であり、Railsを使用してテーブルを検索しようとしています。これを行うには、SQLの知識を使用しています。しかし、これはレールやルビーのようにも見えません...

私が以下で行っていることを行うためのより良い方法はありますか?(基本的に、日付引数が入力されている場合にのみSQLに渡します)

def search(begin_date=nil, end_date=nil)

    subject = " and created_at "

    if !(begin_date.nil? || end_date.nil?)
      where_part = subject + "BETWEEN :begin_date AND :end_date"
    else if (begin_date.nil? && end_date.nil?) 
      where_part = ""
    else if(begin_date.nil?)
      where_part = subject + " <= :end_date"
    else if (end_date.nil?)
      where_part = subject + " >= :begin_date"
    end
    end
    end
    end

    User.joins(places: {containers: {label: :user}}).where("users.id= :user_id "+where_part, user_id: self.id, begin_date:begin_date, end_date:end_date).group(...).select(...)
end

編集

user.rb

has_many :containers
has_many :user_places
has_many :places, through: :user_places
has_many :labels

place.rb

has_many :containers
has_many :user_places
has_many :users, through: :user_places

container.rb

belongs_to :label
belongs_to :place
belongs_to :user

label.rb

belongs_to :user
has_many :containers

基本的に、特定のユーザーのラベル内または直接的な関係を持つコンテナーの数を場所ごとにカウントし、開始日と終了日でフィルターできるようにしたいです。

この日付のいずれかがゼロである可能性があるため、「クエリ」でこれに対処する必要があります。

私の質問は:どうすればこれをレールの方法で行うことができますか?http://guides.rubyonrails.org/active_record_querying.htmlを見て、おそらくどこかでexceptコマンドを使用できます...しかし、この関係モデルは、ActiveRecordでこれを行うには少し複雑に思えます...どうすればよいですか?私は?、私は本当にActiveRecordを使うべきだと思いますが、どうやって?

ありがとうございました

4

2 に答える 2

21

クエリに複数のwhere呼び出しを適用して、基本クエリを作成できます。

query = User.joins(...)
            .group(...)
            .select(...)
            .where('users.id = :user_id', :user_id => self.id)

where次に、日付間隔に応じて別の呼び出しを追加します。

if(begin_date && end_date)
  query = query.where(:created_at => begin_date .. end_date)
  # or where('created_at between :begin_date and :end_date', :begin_date => begin_date, :end_date => end_date)
elsif(begin_date)
  query = query.where('created_at >= :begin_date', :begin_date => begin_date)
elsif(end_date)
  query = query.where('created_at <= :end_date', :end_date => end_date)
end

呼び出しごとwhereに、ANDを使用して全体的なWHERE句に別の部分が追加されます。

q = M.where(a).where(b).where(c)

と言うのと同じWHERE a AND b AND cです。

于 2012-07-27T18:24:43.783 に答える
0

あなたが実際にあなたのコードでSQLを生成したいと思う大きな理由を私は考えることができません。Active Recordは、それを使用できない理由がない限り、ニーズに対してはるかに効率的なソリューションのように思われます。

テーブルをアクティブレコードと結合する方法を説明するリンク

于 2012-07-27T15:34:54.280 に答える