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 中进行映射时,它会返回同样多的结果,但全部为零:

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 ...

奇怪的是word在之前的find中以符号的形式出现。

编辑 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工作,但已将其添加为编辑而不是答案,因为我不明白为什么需要此解决方案。这似乎是一个 hacky 解决方法

该解决方案需要进行两项更改:

  • 更改了 SQL 视图,因此属性与关系不同
  • 在不定式模型上将 attr_reader更改为attr_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* 该方法应返回字符串/fixnum 值(负责.to_s)。

于 2013-01-07T14:20:12.927 回答