Rich many to many // Rozwiazane

Czesc, ucze sie RoR i trafilem na problem ktorego nie jestem w stanie rozwiazac sam ani z stackoverflow :smile: Mam trzy modele user, channel i subscription. User moze subskrybowac kanaly i nadawac im swoje nazwy, ktore sa przechowywane w tabeli subscriptions.
User.model

class User < ActiveRecord::Base
has_many :subscriptions
end

Channel.model

class Channel < ActiveRecord::Base
  has_many :subscriptions
end

Subscription.model

class Subscription < ActiveRecord::Base
  belongs_to :user
  belongs_to :channel
end

Migracje:

class CreateSubscriptions < ActiveRecord::Migration
  def up
    create_table :subscriptions do |t|
      t.references :user
      t.references :channel
      t.string :name, :null => false
    end
    add_index :subscriptions, ["user_id", "channel_id"]
  end

  def down
    drop_table :subscriptions
  end
end

class CreateChannel < ActiveRecord::Migration
  def up
    create_table :channels do |t|
      t.string "url", :null => false
      t.timestamps
    end
  end

  def down
    drop_table :channels
  end
end

class CreateUsers < ActiveRecord::Migration

  def up
    create_table :users do |t|
      t.string "username", :null => false, :unique => true
      t.string "email", :null => false
      t.boolean "public", :default => true
      t.string "password_digest", :null =>false
      t.timestamps
    end
  end

  def down
    drop_table :users
  end
end

W kontrolerze akcja odpowiedzialana za dodawanie subskrybcji wyglada tak:

def create
 @channel = Channel.where(url: params[:url])
 if @channel.blank?
   @channel = Channel.new(url: params[:url])
 end

 @subscription = Subscription.new(name: params[:name], user_id: session[:user_id], channel: @channel)

 respond_to do |format|
  #reszta kodu
 end

end
Z formularza otrzymujemy nazwe kanalu i jego url. Problem wystepuje gdy dany kanal juz istnieje w bazie danych (zostal pobrany przez @channel = Channel.where(url: params[:url])) wtedy podczas tworzenia subskrybcji wystepuje blad:

Channel(#33261440) expected, got ActiveRecord::Relation::ActiveRecord_Relation_Channel(#33198120)

Podczas zabawy w konsoli zauwazylem ze gdy odczytuje kanal z bazy danych po url dostaje taki obiekt

#<ActiveRecord::Relation [#<Channel id: 7, url: "test", created_at: "2014-02-19 21:20:39", updated_at: "2014-02-19 21:20:39">]> 

Mysle ze waznym elementem jest “ActiveRecord::Relation” ale nie jestem w stanie znalezc rozwiazania. Mam nadzieje ze jasno opisalem moj problem :smiley:

==========================================================================
EDIT

Oczywiscie jak napisalem post na forum to zauwazylem ze .where zwraca liste obiektow i wystarczy z niej wyciagnac pierwszy element przez .first

@channel = Channel.where(url: params[:url])
 if @channel.blank?
   @channel = Channel.new(url: params[:url])
 end

zapisałbym prościej

@channel = Channel.where(url: params[:url]).first_or_initialize