0

私はコントローラでこのコードを書きました:

def list
  @codes = Code.order("created_at")
  @languages = Language.order('name').collect {|l| [l.name, l.coderay]}

@codes投稿の配列です。各コードには、または文字列languageのフィールドがあります。coderay トークンが含まれています。形式のプログラミング言語の配列です。 つまり、 の形式はです。ビューでのみ使用して、選択ボックスを作成します。なので、:coderay を主キーとして使っていますが、このモデルには ruby​​ が独自の PK を追加しています。そして、これらのモデルはリンクされていません。cpptext
@languages['C++', 'cpp'], ['Plain Text', 'text']
Language:name, :coderay:id

IDE から次の警告が表示されます。

コントローラー アクションは、最初の find または new
以外の 1 つのモデル メソッドを呼び出す必要があります モデル クラス内にすべてのビジネス ロジックを実装し、単一のメソッドを使用してそれにアクセスすることをお勧めします。

この問題を解決するための最良の解決策は何ですか? 1) と の間に
1 対 m のリンクを追加し、 PKを作成します。 2) この警告を無視します。 3) ビューに移動します。CodesLanguage:coderay

Language.order('name').collect {|l| [l.name, l.coderay]}

最善の解決策は(1)だと思いますが、どうすればよいですか?

4

2 に答える 2

2

この場合、1回の選択で3が必要な場合は、3が最適です。

select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, { :include_blank => true })

Railsドキュメントの例

また、ビジネスロジックに必要のない関連付けを作成しないでください。

于 2012-06-30T14:27:00.847 に答える
1

オプション 1 を実装して、belongs to を使用し、外部キーを設定することで、 と のLanguage間に 1 対 1 のリンクを追加できます。Code

code.rb

belongs_to :language, foreign_key: 'coderay', primary_key: 'language'

言語.rb

has_many :codes, foreign_key: 'coderay', primary_key: 'language'

ただし、選択ボックスの静的データをロードする場合は、通常、コントローラーの before_filter からそれを行い、それをビューに渡すことを好みます。

あなたもdecent_exposure宝石が好きかもしれません。- https://github.com/voxdolo/decent_exposure

于 2012-06-30T14:37:42.540 に答える