所以我试图建立一个存储当前天气的数据库:
-------------- ------------------ ----------
| | 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.
答案 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有更长的解释。