0

私の 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_readerattr_accessibleに変更しました。

Rails はリレーションシップと同じ名前の属性を持つことを処理できると予想していましたが、さらに重要なことに、SQL ビューに基づく ActiveRecord リレーションはattr_reader であり、 attr_accessibleではないと予想していました。

ここで何が起こっているのか誰でも説明できますか?

4

2 に答える 2

0

「include_blank」を削除するか、prompt代わりに使用してください

.field
  = f.label :infinitive_id
  = f.collection_select :infinitive_id, Infinitive.find(:all), :id, :word, prompt: :false, :title => "Infinitive"
于 2013-01-07T12:04:41.323 に答える
0

これは、不定詞の :id および :word メソッドが nil を返すためです。

attr_reader :id, :word
  • それは問題です。

さらに、 :word は関連付けであり、 Word オブジェクトを返します...ただし、 *collection_select* の場合、そのメソッドは string/fixnum 値を返す必要があります (責任のある.to_s )。

于 2013-01-07T14:20:12.927 に答える