Проблема с соглашениями об именах рельсов - PullRequest
1 голос
/ 18 декабря 2011

Я думаю, что следовал правилам именования рельсов в моем приложении. Но когда я нахожусь в коде тестирования терминала, я сталкиваюсь с некоторыми ошибками, которые противоречат соглашениям об именах. Вот мой терминальный сеанс:

irb(main):010:0> a = _
=> #<Neighborhood id: 24, name: "Lincoln Park", created_at: "2011-12-03 20:29:00", updated_at: "2011-12-03 21:08:47", minlat: 41.91092, maxlat: 41.925658, minlng: -87.648761, maxlng: -87.636117>
irb(main):011:0> a.cta_trains
NoMethodError: undefined method `cta_trains' for #<Neighborhood:0x007fd666ee61e8>
    from /usr/local/Cellar/ruby/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activemodel-3.1.1/lib/active_model/attribute_methods.rb:385:in `method_missing'

Теперь, когда я пробую a.CtaTrains:

irb(main):012:0> a.CtaTrains
  CtaTrain Load (0.4ms)  SELECT "cta_trains".* FROM "cta_trains" INNER JOIN "cta_locations" ON "cta_trains"."id" = "cta_locations"."CtaTrain_id" WHERE "cta_locations"."neighborhood_id" = 24
SQLite3::SQLException: no such column: cta_locations.CtaTrain_id: SELECT "cta_trains".* FROM "cta_trains" INNER JOIN "cta_locations" ON "cta_trains"."id" = "cta_locations"."CtaTrain_id" WHERE "cta_locations"."neighborhood_id" = 24
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: cta_locations.CtaTrain_id: SELECT "cta_trains".* FROM "cta_trains" INNER JOIN "cta_locations" ON "cta_trains"."id" = "cta_locations"."CtaTrain_id" WHERE "cta_locations"."neighborhood_id" = 24

Из моих моделей:

class Neighborhood < ActiveRecord::Base

  has_many :cta_trains, :through => :cta_locations
  has_many :cta_locations, :foreign_key => :neighborhood_id

end 

class CtaTrain < ActiveRecord::Base

  has_many :neighborhoods, :through => :cta_locations
  has_many :cta_locations, :foreign_key => :cta_train_id

end

class CtaLocation < ActiveRecord::Base

  belongs_to :neighborhood
belongs_to :cta_train

end

Я нахожусь в тупике, застрял, ударился головой о стену и т. Д. Любая помощь была бы невероятной.

Рельсы тут нуби .... как будто эта точка не очевидна .....

Ответы [ 2 ]

1 голос
/ 18 декабря 2011

Заметил, что вы, кажется, находитесь в IRB ... Вместо этого я бы попытался остаться в консоли rails при работе с вашими классами активной записи.

так что начните с

bundle exec rails console
0 голосов
/ 18 декабря 2011

Здесь вам нужен соединительный стол.См. Ассоциацию has_and_belongs_to_many.

В таблице соединений будут храниться ссылки между определенным Neighbourhood и определенным CtaTrain.Здесь это CtaLocation, но если вы не планируете фактически использовать эту модель, вы можете даже не определить ее.

Например, вы можете достичь этого с тремя таблицами (окрестности, cta_trains и cta_trains_neighbourhoods) и только двумямодели как:

class Neighbourhood
  has_and_belongs_to_many :cta_trains
end

class CtaTrain
  has_and_belongs_to_many :neighbourhoods
end
...