私の Rails アプリケーションには、SQL ビューに基づく collection_select があります。ビューは SQL から正常に動作し、ビューには多くのエントリがあります。
fsix_dev=> SELECT "infinitives".* FROM "infinitives";
id | word | language_id | audiofile | imagefile | gender
-----+-------------+-------------+-----------+-----------+--------
17 | aller | 2 | | |
61 | venir | 2 | | |
69 | suivre | 2 | | |
... etc ...
私の編集ビューの collection_select :
.field
= f.label :infinitive_id
= f.collection_select :infinitive_id, Infinitive.find(:all), :id, :word, include_blank: :false, :title => "Infinitive"
ページ上で、collection_select はビュー内の各行のエントリを戻すように見えますが、すべて空白の値でレンダリングされます
<div class='field'>
<label for="word_infinitive_id">Infinitive</label>
<select id="word_infinitive_id" name="word[infinitive_id]"><option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
... etc ...
モデル
class Infinitive < ActiveRecord::Base
belongs_to :word
attr_reader :id, :word, :language_id, :audiofile, :imagefile
end
class Word < ActiveRecord::Base
has_many :infinitives
attr_accessible :word, :gender, :audiofile, :imagefile, :speech_part_id, :ssubject_id, :present_participle, :past_participle, :tense_id, :mood_id, :infinitive_id, :question, :negative
end
コントローラ
class InfinitivesController < InheritedResources::Base
end
編集
以下の Valery Kvon のメモに従って、 rails consoleで次のことを試したところ、多くの応答が得られました。
1.9.3-p194 :001 > Infinitive.find(:all)
Infinitive Load (338.9ms) SELECT "infinitives".* FROM "infinitives"
=> [#<Infinitive id: 17, word: "aller", language_id: 2, audiofile: nil, imagefile: nil, gender: nil>, #<Infinitive id: 61, word: "venir", language_id: 2, audiofile: nil, imagefile: nil, gender: nil>, ... many results ...
ただし、:word でマップしようとすると、同じ数の結果が返されますが、すべて nil:
1.9.3-p194 :002 > Infinitive.find(:all).map(&:word)
Infinitive Load (1.4ms) SELECT "infinitives".* FROM "infinitives"
=> [nil, nil, nil, nil, nil, nil, nil, nil, nil ... etc ...
奇妙なのは、前のfindでwordが記号として表示されることです。
編集2
word列の名前をinfinitive_wordに変更してみました.... 同じ結果です。RailsのSQLビューからcollection_selectを構築できますか?
1.9.3-p194 :002 > Infinitive.find(:all)
Infinitive Load (1.6ms) SELECT "infinitives".* FROM "infinitives"
=> [#<Infinitive id: 17, infinitive_word: "aller", audiofile: nil, imagefile: nil, gender: nil>, #<Infinitive id: 61, infinitive_word: "venir", audiofile: nil, imagefile: nil, gender: nil>, ... etc ....
infinitive_wordへのマップ:
1.9.3-p194 :003 > Infinitive.find(:all).map(&:infinitive_word)
Infinitive Load (1.3ms) SELECT "infinitives".* FROM "infinitives"
=> [nil, nil, nil, nil, nil, nil, nil, nil, nil,
編集3
collection_selectを機能させることができましたが、このソリューションが必要な理由がわからないため、回答ではなく編集として追加しました。ハックな回避策のようです
このソリューションには、次の 2 つの変更が必要でした。
- 属性がリレーションシップと同じにならないように SQL ビューを変更しました
- 不定詞モデルでattr_readerをattr_accessibleに変更しました。
Rails はリレーションシップと同じ名前の属性を持つことを処理できると予想していましたが、さらに重要なことに、SQL ビューに基づく ActiveRecord リレーションはattr_reader であり、 attr_accessibleではないと予想していました。
ここで何が起こっているのか誰でも説明できますか?