Czesc, ucze sie RoR i trafilem na problem ktorego nie jestem w stanie rozwiazac sam ani z stackoverflow 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
==========================================================================
EDIT
Oczywiscie jak napisalem post na forum to zauwazylem ze .where zwraca liste obiektow i wystarczy z niej wyciagnac pierwszy element przez .first