ruby on rails एचएबीटीएम एसोसिएशन में नाम की विशिष्टता की पुष्टि करें



ruby-on-rails validation (1)

इस मामले में सबसे सरल तरीके से आपके रिलेशन मॉडल में एक कस्टम वैलिएटर लगाया जाएगा:

class AlbumArtist < ActiveRecord::Base
  belongs_to :album
  belongs_to :artist

  validates_presence_of :album, :artist

  validate :ensure_unique, on: :create

  private

  def ensure_unique
    if self.artist.albums.where(name: self.album.name).any?
      errors[:base] << 'Artist already has an album by this name'
    end
  end
end

यदि आपके पास पहले से कोई नहीं है, तो आप नाम स्तंभ में कोई अनुक्रमणिका भी जोड़ना चाह सकते हैं

https://code.i-harness.com

मेरे पास एक Artist मॉडल है जिसमें एचएबीटीएम एसोसिएशन के कई Album हैं। यद्यपि मैं दो अलग एल्बमों को समान नाम रखने की अनुमति देना चाहता हूं, मैं यह सुनिश्चित करना चाहता हूं कि एक कलाकार के संग्रह में दो नहीं हैं अभी तक उदाहरण:

artist_1 = Artist.create(name: "Jay-Z")
artist_2 = Artist.create(name: "The Beatles")

album_1 = Album.create(name: "The Black Album", artist_ids: [1])

album_2 = Album.create(name: "The Black Album", artist_ids: [1])
=> Should return error

album_2 = Album.create(name: "The Black Album", artist_ids: [2])
=> Should not return an error

मैंने पहले Album मॉडल में नाम की अद्वितीयता को मान्य करने का विचार किया था लेकिन जब मैं एक नया ऑब्जेक्ट बनाने का प्रयास करता हूं तो यह त्रुटि मिलती है:

SQLite3::SQLException: no such column: albums.artist_id: SELECT 1 AS one FROM "albums" WHERE ("albums"."name" = 'The Black Album' AND "albums"."artist_id" IS NULL) LIMIT 1

फिर मैंने अपने AlbumArtist शामिल होने के मॉडल, AlbumArtist में मान्यता देने पर विचार किया, लेकिन त्रुटि को undefined method 'name' ( name एल्बम के विशेषताओं में से एक है):

undefined method `name' for #<AlbumArtist:0x007f8e1fc335e8>

में इससे कैसे चला सकता हूँ?

class Album < ActiveRecord::Base
    has_many :album_artists
    has_many :artist, through: :album_artists
end

class AlbumArtist < ActiveRecord::Base
  belongs_to :album
  belongs_to :artist

  # validates_uniqueness_of :name, scope: [:artist_id]
end

class Artist < ActiveRecord::Base
  has_many :album_artists
  has_many :albums, through: :album_artists

  # validates_uniqueness_of :name, scope: [:artist_id]
end

योजना

create_table "albums", force: :cascade do |t|
  t.string   "name"
end

create_table "album_artists", force: :cascade do |t|
  t.integer  "album_id"
  t.integer  "artist_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

add_index "album_artists", ["album_id"], name: "index_album_artists_on_album_id"
add_index "album_artists", ["artist_id"], name: "index_album_artists_on_artist_id"

create_table "artists", force: :cascade do |t|
  t.string   "name"
end




unique