0

私はRails関連ガイドを読んで再読しています:

http://guides.rubyonrails.org/association_basics.html

これは似ていましたが、まったく同じではありませんでした:

Ruby on rails のアクティブなレコードの関連付け

次のシナリオを設定する方法がわかりません。

イベントには、保留中、オープン、クローズのいずれかのステータスがあります。

これは、次のようにするだけで十分簡単だと思いました。

event has_one status
status belongs_to event

ただし、ステータスは多くのイベントに属する可能性があるため、これは実際には 1 対 1 の関係ではありません。

それで、私は次のようなことをしたいと思いました:

status has_many events
event belongs_to status

しかし、ステータスはイベントを所有していないため、これはおかしいようです。イベントにはステータスがありますよね?

列挙を使用しようとしましたが、ステータス モデルがありません。しかし、ActiveRecord は実際には列挙をサポートしていないように見えるため、注意が必要です。また、「承認待ち」などを追加するなど、ステータスのオプションの数を増やしたい場合に備えて、別のモデルを用意するのが良いかもしれないと考えました。

この投稿は、おかしいとはいえ、私の後者のセットアップは問題ないことを示唆しています。

非常に簡単なRails Active-Record Associationsの質問

しかし、この単純なシナリオを処理するためのより良い Ruby/Rails の方法を知らないのではないかと思っています。

前もって感謝します!

4

4 に答える 4

3

これをアクティブなレコードの関連付けとして行うのはやり過ぎです。考えてみてください。変更されない 3 つの値を格納するためだけにテーブル全体を作成しますか?

本当に必要なのは列挙型です。しかしもちろん、Ruby には列挙型がありません。

幸いなことに、偽造することができます。

module StatusCodes
  pending = 0
  open = 1
  closed = 2
end

次に、このようなことができます

if @event.status == StatusCodes::open
  # do something
end

これははるかに単純なソリューションであり、コードは非常に読みやすいままです。

于 2012-06-23T02:29:42.657 に答える
2

頭の中のその声を無視してください。あなたはうまくやっています。モデルが持つ真の重要性はbelongs_to、外部キーがどこに格納されているかです。この例では、外部キーをEventモデルに格納する必要があることは明らかです。つまり、 belongs_to :status.

ただし、他の投稿にも同意します-潜在的なStatusレコードの数が少なく固定されている場合は、それらのデータベーステーブル全体を作成する代わりに、定数ハッシュを作成してそれらを保存することを検討してください.

(整数として)にstatus列を追加して、次のようにしてみませんか:Event

class Event < ActiveRecord::Base
  STATUS_TYPES = {1 => "active", 2 => "inactive", 3 => "closed"}

  def status
    STATUS_TYPES[self[:status]]
  end

  def status=(new_status)
    new_status = STATUS_TYPES.invert[new_status] if new_status.class == "String"
    self[:status] = new_status
  end
end
于 2012-06-23T02:31:56.867 に答える
1

アソシエーションや手動の列挙型を使用する代わりに、state_machineと単純な文字列列を使用してステータスを実装することを検討することをお勧めします。

于 2012-06-23T03:07:31.767 に答える
0

あなたは間違っている。

もしあなたがそうするなら

Event
 has_one :status

Status
 belongs_to :event

Rails は 1 対 1 の関連付けであることを確認するため、ステータスは 1 つのイベントにのみ属します

イベントステータスを別のイベントに割り当てようとすると、これが起こると確信しています

e1 = Event.first
status = e1.status

e2 = Event.new
e2.status = status
e2.save

Event.first.status #=> nil
于 2012-06-23T01:54:24.413 に答える