#ruby-on-rails-3 #activerecord #has-many-through #railscasts
#ruby-on-rails-3 #activerecord #имеет много сквозных #железнодорожные трансляции
Вопрос:
Код модели
class Location < ActiveRecord::Base
attr_accessible :day_tokens, :name, :address, :phone
has_many :locavailability
has_many :dayavailables, :through => :locavailability
attr_reader :day_tokens
def day_tokens=(ids)
self.locavailability.dayavailable_id= ids.split(",")
end
end
class Dayavailable < ActiveRecord::Base
has_many :locavailability
has_many :locations, :through => :locavailability
end
class Locavailability < ActiveRecord::Base
attr_accessible :dayavailable_id, :location_id
belongs_to :dayavailable
belongs_to :location
end
Столбцы базы данных:
locations: id, name, address, phone, hours, created_at, updated_at
dayavailables: id, day, time, created_at, updated_at
locavailabilities: id, location_id, dayavailable_id, created_at, updated_at
Ошибка
irb(main):004:0> l = Location.find(1)
=> #<Location id: 1, name: "test", address: "123 Fake Street", phone: "23443234324", hours: "M-F 9 - 5", created_at: "2011-05-16 04:56:31", updated_at: "2011-05-16 04:56:31">
irb(main):005:0> l.class
=> Location(id: integer, name: string, address: string, phone: string, hours: string, dentistry_id: integer, created_at: datetime, updated_at: datetime)
irb(main):006:0> l.locavailability
=> []
irb(main):007:0> l.dayavailable_id
NoMethodError: undefined method `dayavailable_id' for #<Location:0xb6af7c40>
from /usr/lib/ruby/gems/1.8/gems/activemodel-3.0.0/lib/active_model/attribute_methods.rb:364:in `method_missing'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.0/lib/active_record/attribute_methods.rb:46:in `method_missing'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.0/lib/active_record/attribute_methods.rb:44:in `send'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.0/lib/active_record/attribute_methods.rb:44:in `method_missing'
from (irb):6
Не должен ли Location class иметь доступ к dayavailable_id
?? Я использую код из railscasts эпизода 258 на github
Чего мне не хватает?
Ответ №1:
Почему Location
должен быть доступ к dayavailable_id
? dayavailable_id
Является столбцом locavailabilities
, если вы указали true:
Столбцы базы данных:
местоположения: идентификатор, имя, адрес, телефон, часы работы, created_at, updated_at
доступные данные: идентификатор, день, время, created_at, updated_at
locavailabilities: id, location_id, dayavailable_id, created_at, updated_at
Попробуйте это: ОБНОВЛЕНО
l = Location.find(1)
l.dayavailable_ids #=> Returns an array of the associated objects’ ids
Но если вы вызываете dayavailable_id
, это должен быть столбец таблицы.
Поэтому l.dayavailable_ids
будет выполнен этот запрос к БД:
select id from dayavailables d
inner join locavailabilities l on l.dayavailable_id = d.id
where l.location_id = 1
но Locavailability.find(1).dayavailable_id выполнит этот запрос к БД (не совсем, только для более читаемого):
select dayavailable_id from locavailabilities l
where l.location_id = 1
Комментарии:
1. как вы можете видеть из моего вывода на консоль,
l.locavailability
возвращает массив[]
. Я не могу вызватьdayavailable_id
это. Кроме того, как показано в ссылке на github, их автор вызывает таким же образом, как и я.2. Однако теперь я вижу опечатку. автор кода на github добавляет
s
в концеid
, однако я этого не делаю. Я бы хотел попробовать это, но действительно ли это что-то изменит? Не могу попробовать это некоторое время, так как меня нет рядом с домашним компьютером : (3. мило. объяснение проблемы кому-либо сработало намного лучше, чем пялиться в код, чтобы выяснить, почему, черт возьми, это не работает.