2013-06-30 33 views
0

我有兩個模型 - 「符號」和「用戶」。在其他屬性中,符號具有「created_by_id」和「updated_by_id」屬性,這些屬性是創建/更新某個符號條目的用戶的id。同一類型的多個嵌套屬性

比方說,我想顯示符號表及其「符號」屬性以及每個符號條目的嵌套「創建者」和「更新者」(user.username)屬性。結果表應該是這樣的:

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

我該如何實現這一目標?我想我需要accepts_nested_attributes_for :user和可能has_one :user(?)在我的符號模型。我的用戶模型中是否還需要belongs_to :user

模型設置正確後,如何在我的視圖中訪問與「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 %> 

,但我無法弄清楚如何做到在這種情況下,類似的在那裏我有兩個嵌套屬性的東西與相同的符號相關聯。

我是新來的鐵路,所以也許我得到了如何做到這一點錯誤的整個想法。如果比我剛剛解釋我想要做的更好,請糾正我。

編輯:這裏是模型。第一個實際上稱爲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關係,因爲我不知道什麼樣的關係,以在加有..它應該像在JSymbol模型has_one :userbelongs_to :j_symbol在用戶模式,除了它需要可以做兩遍......也可以在每個符號的action方法中調用.build方法。

+0

可能不是最好的方式,我解決了這個與sendind值的幫手,找到用戶並返回該用戶的名稱。 – rmagnum2002

+0

是的,我想到這一點,但對於10頁的一頁,我會做20分貝查詢只提取所有用戶名..所以這是我最後的手段。謝謝你的答案。 – pootzko

+0

請發送'user'和'symbol'模型,它們之間有reations的部分 – rmagnum2002

回答

0

rmagnum2002後讓我意識到,我可以在這裏使用foreign_key參數,我開始google搜索「軌多重外鍵同桌」,偶然發現了一大堆的沒過時的SO答案沒有工作,最後找到this article,這幫助我編寫了可行的代碼。

所以,這是關係,我把我的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" 

而這一次是從用戶模式:

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 
1

像這樣的東西應該工作:

class Symbol < ActiveRecord::Base 
    has_many :creators, class_name: "User", 
          foreign_key: "created_by_id" 
    has_many :updaters, class_name: "User", 
          foreign_key: "updated_by_id" 

    belongs_to :creator, class_name: "User" 
end 

然後使用:

symbol | symbol.creator.name | symbol.updater.name 

還在,我想這對我的應用程序,所以我不能100%肯定它。

編輯

class Symbol < ActiveRecord::Base 
    has_one :creator, :class_name => User, :foreign_key => 'created_by_id' 
    has_one :updater, :class_name => User, :foreign_key => 'updated_by_id' 
end 
+0

我會試試看。你有沒有添加任何操作方法來獲取這些用戶? – pootzko

+0

不知道你的情況應該是什麼,'has_one'或'has_many',取決於你的應用程序。 – rmagnum2002

+0

+1幫助我通過foreign_key理念走上正確的軌道。 – pootzko