Rails2.3.14を使用しています
UPDATE 3 Update 2で見つけたトリックは、関連付けの最初のアクセスに対してのみ機能します...したがって、アプリケーションコントローラーにset_table_name行を貼り付けます。これはとても奇妙です。これが修正されることを願っています。= \
UPDATE 2環境ファイルの下部にある厄介なクラスのテーブルを手動で/厄介に/ハッキーに設定すると、エラーが発生しなくなります。
app / config / environment.rb:
Page::Template::Content.set_table_name "template_page_contents"
Page::Template::Section.set_table_name "template_page_sections"
なぜ私はこれをしなければならないのですか?この特定のユースケースではレールが壊れていますか?
更新:私のPage :: Template :: Contentクラスで最初に呼び出されたとき、set_table_nameが機能していないようです。
しかし、アソシエーションを使用する直前に呼び出すと、機能します...
ap Page::Template::Content.table_name # prints "contents"
Page::Template::Content.set_table_name "template_page_contents"
ap Page::Template::Content.table_name # prints "template_page_contents"
return self.page_template_contents.first # doesn't error after the above is exec'd
元の質問:
TL; DR:アクセスしようとしているhas_manyリレーションシップがありますが、Railsは、has_manyリレーションシップが使用するテーブルは別のテーブルであると考えています。
リレーションシップを介してaPage::Template::Content
にbelongs_toにアクセスしようとすると、このエラーが発生します。Page::Template
has_many
Mysql2::Error: Unknown column 'contents.template_page_id' in 'where clause': SELECT * FROM `contents` WHERE (`contents`.template_page_id = 17) LIMIT 1
エラーログを見ると、railsが間違ったテーブルで関連するオブジェクトを見つけようとした理由を見つけるために、いくつかのprintステートメントの使用を開始する必要があることがわかりました。
gems_path/activerecord-2.3.14/lib/active_record/associations/association_collection.rb:63:in `find'
@reflection
すべてがその周りで起こっているように見えるので、私はちょうどオブジェクトを印刷することにしました。これが私がそれをした方法です:
require "awesome_print" # best console printer (colors, pretty print, etc)
def find(*args) # preexisting method header
ap "-------" # separator so I know when one reflection begins / ends, etc
ap @reflection # object in question
... # rest of the method
エラーの前に出力された最後の「@reflection」:
"-------"
#<ActiveRecord::Reflection::AssociationReflection:0x108d028a8
@collection = true,
attr_reader :active_record = class Page::Template < LibraryItem {...},
attr_reader :class_name = "Page::Template::Content",
attr_reader :klass = class Content < LibraryItem {...},
attr_reader :macro = :has_many,
attr_reader :name = :page_template_contents,
attr_reader :options = {
:foreign_key => "template_page_id",
:class_name => "Page::Template::Content",
:extend => []
},
attr_reader :primary_key_name = "template_page_id",
attr_reader :quoted_table_name = "`contents`"
>
上記のコードブロックにはいくつか問題があります。
:klass should be Page::Template::Content
:name should be :contents
:quoted_table_name should be `contents`
モデルの設定方法:
app / models / page.rb:
class Page < LibrayItem
belongs_to :template_page, :class_name => "Page::Template"
app / models / page / template.rb
class Page::Template < Library Item
set_table_name "template_pages"
has_many :page_template_contents,
:class_name => "Page::Template::Content",
:foreign_key => "template_page_id"
app / models / page / template / content.rb
class Page::Template::Content
set_table_name "template_page_contents"
belongs_to :template_page,
:class_name => "Page::Template",
:foreign_key => "template_page_id"
class Page::Template
...
return self.page_template_contents.first
アソシエーションが選択しているクラス(上記の私のページ/テンプレート構造とは関係ありません):
class Content < LibraryItem
set_table_name "contents"
# no associations to above classes
だから...これを引き起こしているのは何ですか?どうすれば修正できますか?