0

Rails アプリのデータ モデルを作成しようとしています。

基本的に、4 つの異なる場所のレコードを含む場所テーブルがあります。毎日、場所ごとにタイムスロットを作成しようとしています。例えば。Location1 には午前 9 時のスロットが 5 つ、午前 11 時のスロットが 5 つなどがあります。

ここで、特定のタイムスロットの場所の手配を作成できる必要があります。

現在、私はこのアプリを動作させています。唯一の問題は、アレンジメントを保存するときに、タイムスロット レコードをアレンジメント ID で更新する必要があり、毎日のすべての場所のタイムスロットごとにレコードが存在する必要があることです。

これを行うためのより良い方法が必要であることはわかっています。

ここに私の現在のデータモデルがあります:

ここに画像の説明を入力

これが私の現在のモデル設定です:

class Location < ActiveRecord::Base
    has_one :arrangement
    has_many :timeslots
end

class Timeslot < ActiveRecord::Base
    belongs_to :location
    has_one :arrangement
end

class Arrangement < ActiveRecord::Base
    belongs_to :location
    belongs_to :timeslot
end

そして、これが配置コントローラーの現在の create メソッドのスニペットです。

if @arrangement.save
# update the timslot record with the arrangement id
if @timeslot = Timeslot.update(@arrangement.timeslot_id, :arrangement_id => @arrangement.id)

このデータ モデルを改善するにはどうすればよいですか?

編集 理想的には、すべての場所と毎日のタイムスロットを入力する必要がないデータモデルを探しています。

理論的には、タイムスロット テーブルに手動で入力する必要がないように、すべての場所のすべてのタイムスロットのみを持つタイムスロット テーブルが必要です。

私が心配している最大のことは、次の 30 年間、タイムスロット テーブルにデータを入力しなければならないことです。

4

2 に答える 2

0

Locationとの間の直接的な関連付けが実際に必要Arrangementですか? has_many :through代わりに、次のように関連付けを使用して整理することを検討します。

class Location < ActiveRecord::Base
    has_many :timeslots
    has_many :arrangements, through: :timeslots
end

class Timeslot < ActiveRecord::Base
    belongs_to :location
    has_one :arrangement
end

class Arrangement < ActiveRecord::Base
    belongs_to :timeslot
end

このようにすると、Arrangementに属する asが作成されるTimeslotため、手動で更新する必要はありません。Arrangementのすべてのを取得したい場合でも、タイムスロットを介して関連付けを設定しているため、Locationでそれを行うことができます。location.arrangementsまた、配置の場所を知る必要がある場合は、 を使用できますarrangement.timeslot.location

(注意してください、それぞれLocationが実際には複数Arrangementの s を持つことができhas_one、あなたの質問の は間違いだと思いますか? その面で間違っている場合はお知らせください。)

于 2013-03-15T00:20:40.860 に答える
0

すべての場所にいくつかのタイムスロットを生成することを想定しているため、これは部分的に機能します。

class Location < ActiveRecord::Base
    has_many :timeslots
    has_many :arrangements, :through => :timeslots
end

class Timeslot < ActiveRecord::Base
    belongs_to :location
    has_one :arrangement
end

class Arrangement < ActiveRecord::Base
    belongs_to :timeslot
end

これを設定する際の問題はnormally、関係を作成できないため、アレンジメントの場所を取得できないことbelongs_to throughです。しかし、基本的には、arrangement.timeslot.userとの属している関係を持つ代わりに、をlocation行うことができます。これはちょっと冗長ですが、そのようにすることもできます。

リレーションの has_one エンドで id を設定する必要はありません。

http://guides.rubyonrails.org/association_basics.html#the-has_one-association

于 2013-03-15T00:09:56.913 に答える