has_many通过Association Rails 4的问题

时间:2015-04-15 03:36:20

标签: ruby-on-rails ruby has-many-through

所以我试图建立一个存储当前天气的数据库:

 --------------             ------------------            ----------
|              | 1       * |                  |*       1 |          | 
| YearMonthDay |-----------| WeatherCondition |----------| Location |
|              |           |                  |          |          |
 --------------             ------------------            ----------

我使用belongs_to和has_many生成模型:通过

class WeatherCondition < ActiveRecord::Base
    belongs_to :year_month_day
    belongs_to :location
end

class YearMonthDay < ActiveRecord::Base
    has_many :weather_conditions
    has_many :locations, :through => :weather_conditions
 end

class Location < ActiveRecord::Base
    has_many :weather_conditions
    has_many :year_month_days, :through => :weather_conditions
end

并为每个人创建了一个迁移,YearMonthDay和Locations正常,WeatherConditions如下:

class CreateWeatherConditions < ActiveRecord::Migration
  def change
    create_table :weather_conditions do |t|
        t.belongs_to :location, index: true
        t.belongs_to :year_month_day, index: true

      t.timestamps null: false
    end
  end
end

我不知道我做错了什么,但我收到了一个错误:

 unknown attribute 'year_month_day_id' for WeatherCondition.

3 个答案:

答案 0 :(得分:2)

您仍然需要将外键添加到WeatherConditions:

如果您要创建新表:

class CreateWeatherConditions < ActiveRecord::Migration
  def change
    create_table :weather_conditions do |t|
        t.integer :location_id
        t.integer :year_month_day_id

      t.timestamps null: false
    end
  end
end

如果您已经拥有该表:

class CreateWeatherConditions < ActiveRecord::Migration
  def change
    add_column :weather_conditions, :location_id, :integer
    add_column :weather_conditions, :year_month_day_id, :integer
  end
end

答案 1 :(得分:0)

Rails特别关于多个表。它可能无法理解如何复数year_month_day。您的架构是什么样的?

答案 2 :(得分:0)

创建多对多关系,您需要has_and_belongs_to_many表示法。

class YearMonthDay < ActiveRecord::Base
    has_and_belongs_to_many :locations
end

class Location < ActiveRecord::Base
    has_and_belongs_to_many :year_month_days
end

删除WeatherConditions的类,您只需要必须命名的连接表以匹配这两个模型。名称必须按字母顺序排列。

create_table :locations_year_month_days, id: false do |t|
    t.belongs_to :location, index: true
    t.belongs_to :year_month_day, index: true

  t.timestamps null: false
end

一旦你有了工作关系,你就可以调用my_date.locations来获取与该日期相关的位置对象数组,或者调用my_location.year_month_dates反之亦然。

Rails guide有更长的解释。