1

has_many :through 関係をラジオ ボタンで表される関係を持つフォームで適切に機能させるのに苦労しています。

この関係は、関連付けられたさまざまなメタデータを持つことができるジョブを記述し、それらのメタデータは異なるタイプにすることができます。このモデルの背後にある考え方は、最終的には、新しいテーブルなどを追加することなく、何らかの種類または値のカテゴリなど、他のタイプのジョブに他のメタデータを追加できるようになるということです。

この例では、仕事を送信するためのフォームがあり、フィールドの 1 つが仕事の種類 (フルタイム、パートタイム、コンサルティング、フリーランス) であり、4 つのラジオ ボタンで表されます。

したがって、DB に保存すると、対応するテーブルに次のようになります。

jobs
 id - 1
 title - "Rails Developer"

jobs_metadata
 job_id - 1
 metadata_id - 1

metadata
 id - 1
 description - "Full Time"
 metadatum_type_id - 1

metadatum_types
 id - 1
 description - "Job Type"

ここに私のモデルの要約があります:

ジョブモデル

class Job < ActiveRecord::Base
   has_many :jobs_metadata
   has_many :metadata, :through => :jobs_metadata

Metadatum (Metadata の単数形) モデル

class Metadatum < ActiveRecord::Base
   has_one :metadata_type
   has_many :jobs_metadata
   has_many :jobs, :through => :jobs_metadata

JobMetadatum モデル<-- このテーブルに他のフィールドを追加する可能性があるため、:through

class JobsMetadatum < ActiveRecord::Base
   belongs_to :job
   belongs_to :metadatum

MetadataType モデル<--例では必要ありませんが、完全を期すために含まれています

class MetadataType < ActiveRecord::Base
   has_many :metadata

ジョブ ビューのラジオ ボタンを表すコードを次に示します。

コードを表示

<% @job_types.each do |job_type| %>
  <%= radio_button_tag("job[metadatum_ids]", job_type.id) %>
  <%= job_type.description %>&nbsp;
<% end %>

フォームを保存すると、すべてが適切に入力されているように見えますが、編集モードに切り替えると、jobs_metadata の値に対応するラジオ ボタンがチェックされません。

だから私は私の質問が2つあると思いました:

  1. 上記で関係を正しく定義しましたか? 私はこれを「The Rails Way」でやっていますか?
  2. フォームのラジオ ボタンを正しく定義していますか?もしそうなら、DB から読み取るときに値を適切にチェックするにはどうすればよいですか?
4

1 に答える 1

2

radio_button_tag への呼び出しで 3 番目のオプションを指定して、それを選択してみてください。

<%= radio_button_tag("job[metadatum_ids]", job_type.id, true) %>

詳細については、こちらを参照してください: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-radio_button_tag

明らかに、テストに基づいてそれを真にしたいので、次のようにジョブオブジェクトにメソッドを定義できます

def full_time?
  self.metadata.include?(Metadata.find(1))
end

その後:

<%= radio_button_tag("job[metadatum_ids]", job_type.id, job.full_time?) %>

私の例はあなたが望むものではないかもしれませんが、うまくいけばアイデアが得られます.

于 2012-06-25T03:54:36.447 に答える