Reputation: 145
I've 2 model:
Performance and PerformanceType and 2 respective tables: performances and performance_types.
Into performances there is a foreign key column "performance_type_id".
How I can get the name of performance_type_id from the other table using ActiveRecord Associations?
class Performance < ActiveRecord::Base
has_one :users
has_one :rates
has_one :performace_types
end
class PerformanceType < ActiveRecord::Base
belongs_to :performances
end
With above code I try to do into console:
myvar = Performance.first
myvar.performance_types
NoMethodError: undefined method `performance_types' for #<Performance:0x007f9694b3e700>
I know that the problem is for my bad interpretation of active record associations, can anyone help me?
regards.
migrations from creating to foreign keys adding...
class CreatePerformances < ActiveRecord::Migration
def change
create_table :performances do |t|
t.timestamps null: false
end
end
end
class CreatePerformanceTypes < ActiveRecord::Migration
def change
create_table :performance_types do |t|
t.timestamps null: false
end
end
end
class AddPerformanceTypeIdToPerformance < ActiveRecord::Migration
def change
add_column :performances, :performance_type_id, :integer
end
end
class AddAppointmentInfoToPerformance < ActiveRecord::Migration
def change
add_column :performances, :user_id, :integer
add_column :performances, :start_at, :datetime
add_column :performances, :end_at, :datetime
end
end
class AddUserToPerformances < ActiveRecord::Migration
def change
add_foreign_key :performances, :users
end
end
class AddTypeToPerformances < ActiveRecord::Migration
def change
add_foreign_key :performances, :performance_types
end
end
class AddAdditionalFieldsToPerformanceType < ActiveRecord::Migration
def change
add_column :performance_types, :name, :string
add_column :performance_types, :description, :string
end
end
class AddPerformanceTypeToRate < ActiveRecord::Migration
def change
add_foreign_key :rates, :performance_types
end
end
class AddRateToPerformances < ActiveRecord::Migration
def change
add_column :performances, :rate_id, :integer
add_foreign_key :performances, :rates
end
end
Upvotes: 0
Views: 82
Reputation: 76
I think that this is what you want. The foreign key performance_type_id remains in performances. You have many performances with the same performance type, but each performance has only one performance type.
class Performance < ActiveRecord::Base
# note performance type is singular
belongs_to :performance_type
end
class PerformanceType < ActiveRecord::Base
has_many :performances
end
p = Performance.first
# this should work
p.performance_type
Upvotes: 1
Reputation: 30071
has_one
and belongs_to
refer to a single object so you should use singularized form
class Performance < ActiveRecord::Base
has_one :users
has_one :rates
has_one :performance_type
end
class PerformanceType < ActiveRecord::Base
belongs_to :performance
end
Upvotes: 4
Reputation:
You should change your Performance class listing the "has_one" relationship with the singular model (not plural):
class Performance < ActiveRecord::Base
has_one :user
has_one :rate
has_one :performance_type
end
class PerformanceType < ActiveRecord::Base
belongs_to :performance
end
It's also important that your migration file is correctly configured, too:
class CreatePerformances < ActiveRecord::Migration
def change
create_table :performances do |t|
end
create_table :performance_types do |t|
t.belongs_to :performance, index: true
t.belongs_to :rate
t.belongs_to :user
end
end
end
Upvotes: 0