0

「シンボル」と「ユーザー」の 2 つのモデルがあります。他の属性の中でも、シンボルには、特定のシンボル エントリを作成/更新したユーザーの ID である「created_by_id」および「updated_by_id」属性があります。

「symbol」属性と、ネストされた「作成者」および「更新者」(user.username) 属性をシンボル エントリごとに含むシンボル テーブルを表示するとします。結果のテーブルは次のようになります。

symbol     created_by    updated_by
------------------------------------
symbol1    username1     username2
symbol2    username1     username2

どうすればこれを達成できますか?accepts_nested_attributes_for :userSymbol モデルに必要で、おそらくhas_one :user(?)必要があると思います。belongs_to :userUser モデルにも必要ですか?

モデルが適切に設定された後、ビューで「created_by_id」および「updated_by_id」に関連付けられたユーザーのユーザー名にアクセスするにはどうすればよいですか?

次のようなネストされたフォームを使用した編集フォームがあります(正常に動作します):

<%= form_for @symbol do |f| %>
  Symbol: 
  <%= f.text_field :symbol %>
  <%= f.fields_for :kanji do |kf| %>
    Meaning:
    <%= kf.text_field :meaning %>

    Onyomi:
    <%= kf.text_field :onyomi %>

    Kunyomi:
    <%= kf.text_field :kunyomi %>
  <% end %>
  <%= f.submit "Save" %>
<% end %>

しかし、同じシンボルに関連付けられた2つのネストされた属性があるこの場合、同様のことを行う方法がわかりませんでした。

私はレールに慣れていないので、おそらくこれを間違って行う方法を完全に理解しました。今説明した方法よりも良い方法がある場合は、修正してください。

編集:ここにモデルがあります。最初のものは実際には JSymbol と呼ばれますが、問題は同じままです。

class JSymbol < ActiveRecord::Base
  belongs_to :j_symbol_type
  has_one :kanji, :dependent => :destroy
  has_one :radical, :dependent => :destroy
  has_one :vocabulary, :dependent => :destroy

  attr_accessible :created_by_id, :updated_by_id, :symbol, :j_symbol_type_id, :level
  attr_accessible :kanji_attributes, :radical_attributes, :vocabulary_attributes

  accepts_nested_attributes_for :kanji, :radical, :vocabulary
end

そしてユーザーモデル。

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable, :lockable, :timeoutable

  attr_accessible :username, :email, :password, :password_confirmation, :remember_me

  validates :username, :presence => true, :uniqueness => true
end

もちろん、そこにどのような関係を追加すればよいかわからないため、これにはユーザーとjsymbolの関係がありませんhas_one :user..JSymbolモデルとbelongs_to :j_symbolUserモデルのようにする必要がありますが、何らかの方法で2回実行する必要があります..各シンボルのアクション メソッドで .build メソッドを呼び出す問題。

4

2 に答える 2

0

rmagnum2002によって、ここでforeign_keyパラメーターを使用できることに気付いた後、「同じテーブルに複数の外部キーをレールにする」というグーグル検索を開始し、機能しない古いSO回答の束に出くわし、最終的にコードを書くのに役立つこの記事を見つけましたそれが機能します。

したがって、これは私が JSymbol モデルに入れた関係です。

belongs_to :created_by, :class_name => User, :foreign_key => "created_by_id"
belongs_to :updated_by, :class_name => User, :foreign_key => "updated_by_id"

これは Users モデルからのものです:

has_many :occurances_as_created_by, :class_name => JSymbol, :foreign_key => "created_by_id"
has_many :occurances_as_updated_by, :class_name => JSymbol, :foreign_key => "updated_by_id"

アクション メソッドに何も追加する必要はありませんでした。これがビューに追加したものです。

<%= j_symbol.created_by.username %>
<%= j_symbol.updated_by.username %>

これは、誰かが興味を持っている場合に SQL で発生することです (つまり、実際には結合ではなく個別の選択クエリを介して実行されるため、より良い解決策を探し続ける可能性があります)。

JSymbol Load (0.3ms)  SELECT "j_symbols".* FROM "j_symbols" 
JSymbolType Load (0.3ms)  SELECT "j_symbol_types".* FROM "j_symbol_types" 
User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 7 LIMIT 1
User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 8 LIMIT 1
CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 8 LIMIT 1
CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 8 LIMIT 1
Rendered j_symbols/index.html.erb within layouts/j_symbols (7.8ms)
CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 8 LIMIT 1
于 2013-06-30T22:02:05.063 に答える