以下のコードは列挙型を使用する多態性モデルの単純化されたバージョンですが、検証には苦労しています。Railsの列挙の検証に失敗しました
モデルの最後の行は問題の検証です。
これは動作します:
validates_inclusion_of :value, in: Vote.values.keys
これがエラーを返す動作しません:
validates_inclusion_of :value, in: vote_options.keys
エラー
ActiveRecord::RecordInvalid: Validation failed: Value is not included in the list
モデル:
class Vote < ApplicationRecord
belongs_to :voteable, polymorphic: true
vote_options = {vote_no: 0, vote_yes: 1}
enum value: vote_options
validates_inclusion_of :value, in: vote_options.keys
end
更新:
class Vote < ApplicationRecord
belongs_to :voteable, polymorphic: true
VOTE_OPTIONS = HashWithIndifferentAccess.new({ vote_no: 0, vote_yes: 1 }).freeze
EMOJI_OPTIONS = HashWithIndifferentAccess.new({thumb_up: 2, thumb_down: 3, happy_face: 4, sad_face: 5}).freeze
enum value: HashWithIndifferentAccess.new.merge(VOTE_OPTIONS).merge(EMOJI_OPTIONS)
validates_inclusion_of :value, in: vote_options.keys
end
アップデート2:
class Like < ApplicationRecord
belongs_to :likeable, polymorphic: true
VOTE_OPTIONS = { vote_no: 0, vote_yes: 1 }.freeze
EMOJI_OPTIONS = { thumb_up: 2, thumb_down: 3, happy_face: 4, sad_face: 5 }.freeze
enum value: VOTE_OPTIONS.merge(EMOJI_OPTIONS)
with_options :if => :is_meeting? do |o|
o.validates_uniqueness_of :user_id, scope: [:likeable_id, :likeable_type], message: "You have already voted on this item."
o.validates_inclusion_of :value, in: HashWithIndifferentAccess.new(VOTE_OPTIONS).keys
end
with_options :if => :is_comment? do |o|
o.validates_uniqueness_of :user_id, scope: [:likeable_id, :likeable_type], message: "You can only tag once."
o.validates_inclusion_of :value, in: HashWithIndifferentAccess.new(EMOJI_OPTIONS).keys
end
def is_meeting?
self.likeable_type == "Meeting"
end
def is_comment?
self.likeable_type == "Comment"
end
end
マージメソッドを使う正しい方法はありますか? https://apidock.com/rails/v4.2.7/ActiveSupport/HashWithIndifferentAccess/merge – Dercni
一般的にはいですが、ハッシュ宣言とマージのIMOよりわかりやすい提案に関する私の更新された回答を参照してください。また、値がある列挙型が必要な理由がわかりません。そのうちのいくつかは無効ですか? (注:私の最初の例では、属性名を修正しました。) – BoraMa
値のないenumを使用すると、順序が暗黙的であるため問題が発生する可能性があることを理解しています。どちらが無効ですか? – Dercni