0

私はこれに頭を悩ませています。

属性を持つモデル (タスク) があります: :day、:room、:begin_time、:end_time、:gear、:notes、およびその他 (関係ありません)。Task モデルの移行セットには、linked_id_task 属性もあります。そして、私はこれらの関連するスコープを持っています(私は一緒に連鎖しています):

scope :for_day, lambda { |day| where(day: day) }
scope :for_room, lambda { |room| where(room: room) }
scope :with_gear, lambda { |gear| where(gear: gear) }
@tasks_on_same_day = Task.for_day(self.day).for_room(self.room).with_gear(self.gear).all
@task_on_previous_day = Task.for_day(self.day.yesterday).for_room(self.room).with_gear(self.gear).last
@task_on_next_day = Task.for_day(self.day.tomorrow).for_room(self.room).with_gear(self.gear).first

新しいタスクを作成する場合でも、新しいタスクを更新する場合でも、次のことを行います。

プライベート インスタンス メソッドで前のタスクと次のタスク ( :begin_time に基づく) を確認します。そして次は?前のタスクがある場合は、その :notes を更新して、そのタスクを :linked_task_id; に追加します。次のタスクがある場合は、次のタスクに関する情報を self.notes に設定し、:linked_task_id に追加します。当日(上記)、前日、翌日にタスクがない場合はnilを返します。

前日と翌日は単純です。なぜなら、前日の最後のタスク (存在する場合) または翌日の最初のタスクを取得するからです。当日に複数のタスクがある場合、タスクを並べ替えて、前後のタスクを簡単に見つけられるようにしたいと考えています。

@self_id = @tasks_on_same_day.index(self)

そのインデックスを使用して、前または次のタスクの update_attributes を実行します。問題は、新しく作成されたタスクまたは更新されたタスク (つまり、begin_time を更新したもの) が before_save コールバックで利用できるとは思えないことです。

現在の日のタスクのリストに自分自身を並べ替えるクラス メソッドを作成できます。

これをコード化してくれる人を探しているわけではありませんが、取るべきアプローチについて混乱しています。

ありがとう。

4

1 に答える 1

0

私の答えの前に:私は初心者です。

しばらくイライラした後、昨夜から中断したところから再開して、RailsCastsを見始めました。そして、私がばかだと気づきました(ActiveRecordのクエリに関するビデオを見て)。

私はまだこれを試していませんが、次のようなものをクエリすることができます...

@previous = Task.for_day(self.day).for_room(self.room).with_gear(self.gear).where('begin_time < ?' self.begin_time).last
@next = Task.for_day(self.day).for_room(self.room).with_gear(self.gear).where('begin_time > ?' self.begin_time).first

それは驚くほど簡単です。この質問を役立つようにするために、そのような長いクエリ文字列のパフォーマンスへの影響は何ですか?

于 2012-11-14T20:47:17.050 に答える