在我的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 ...
奇怪的是字在之前的发现中显示为符号。
编辑2
我尝试将字列重命名为 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 工作,但是将其添加为编辑而不是答案,因为我不明白为什么这个解决方案是必要的。 这似乎是一个hacky解决方法
解决方案需要进行两项更改:
我原本以为Rails可以处理一个与关系同名的属性,但更重要的是我希望基于SQL视图的ActiveRecord关系是 attr_reader ,而不是 attr_accessible
有谁可以解释这里发生的事情?
答案 0 :(得分:0)
只需删除'include_blank'或使用prompt
代替
.field
= f.label :infinitive_id
= f.collection_select :infinitive_id, Infinitive.find(:all), :id, :word, prompt: :false, :title => "Infinitive"
答案 1 :(得分:0)
因为你的不定式:id和:word方法返回nil。
attr_reader :id, :word
此外:word是一个关联并返回Word对象...但是对于* collection_select *该方法应返回string / fixnum值(负责 .to_s )。