Rails3.2でHABTMのレコードを操作したい
Rails3.2でHABTM(Has And Belongs To Many)を実装しました。
prefectures,schoolsがそれぞれHABTMの関係になっており、
中間テーブルがhbtmsとなっております。
prefecture.rb
class Prefecture < ActiveRecord::Base
attr_accessible :name
has_many :hbtms, :foreign_key => :prefecture_id
has_many :schools, :through => :hbtms
end
school.rb
class School < ActiveRecord::Base
attr_accessible :name
has_many :hbtms, :foreign_key => :school_id
has_many :prefectures, :through => :hbtms, :order => "hbtms.position"
end
hbtm.rb
class Hbtm < ActiveRecord::Base
attr_accessible :school_id, :prefecture_id, :position
belongs_to :school
belongs_to :prefecture
end
migration(hbtmのみ 他を載せると多くなるので)
class CreateHbtms < ActiveRecord::Migration
def change
create_table :hbtms, id: false do |t|
t.references :prefecture, index: true, null: false
t.references :school, index: true, null: false
t.integer :position
t.timestamps
end
end
end
質問1
中間テーブルにレコードを追加(多対多のレコード)するときは
Prefecture.find(1).schools << School.find(2)
このように実行しております。
これ以外に値を追加する方法はないでしょうか?
質問2
hbtmテーブルはpositionカラムがあり、ソート順に使おうと思っております。
しかし、このレコードの追加方法ですとpositionに値を設定できません。
そこで、Hbtm.all.last.update_attributes(:position => 9)
と後で変更する際、
このようにエラーが出力されます。
1.9.3-p551 :033 > Hbtm.all.last.update_attributes(:position => 9)
Hbtm Load (21.3ms) SELECT `hbtms`.* FROM `hbtms`
(1.1ms) BEGIN
(2.8ms) UPDATE `hbtms` SET `position` = 9, `updated_at` = '2015-04-07 13:09:52' WHERE `hbtms`.`` IS NULL
Mysql2::Error: Unknown column 'hbtms.' in 'where clause': UPDATE `hbtms` SET `position` = 9, `updated_at` = '2015-04-07 13:09:52' WHERE `hbtms`.`` IS NULL
(0.1ms) ROLLBACK
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'hbtms.' in 'where clause': UPDATE `hbtms` SET `position` = 9, `updated_at` = '2015-04-07 13:09:52' WHERE `hbtms`.`` IS NULL
なぜエラーとして扱われるのでしょうか?
質問3
また、Hbtm.lastを実行するとこのようなエラーが出力されます。
1.9.3-p551 :032 > Hbtm.last
Hbtm Load (38.6ms) SELECT `hbtms`.* FROM `hbtms` ORDER BY `hbtms`.`` DESC LIMIT 1
Mysql2::Error: Unknown column 'hbtms.' in 'order clause': SELECT `hbtms`.* FROM `hbtms` ORDER BY `hbtms`.`` DESC LIMIT 1
なぜエラーとして扱われるのでしょうか?