Ruby 同一类型的多个嵌套属性

Ruby 同一类型的多个嵌套属性,ruby,ruby-on-rails-3.2,nested-attributes,Ruby,Ruby On Rails 3.2,Nested Attributes,我有两个模型——“符号”和“用户”。在其他属性中,符号具有“按id创建”和“按id更新”属性,这是创建/更新特定符号条目的用户的id 假设我想显示符号表及其“symbol”属性以及每个符号条目的嵌套“created by”和“updated by”(user.username)属性。结果表应如下所示: symbol created_by updated_by ------------------------------------ symbol1 username1

我有两个模型——“符号”和“用户”。在其他属性中,符号具有“按id创建”和“按id更新”属性,这是创建/更新特定符号条目的用户的id

假设我想显示符号表及其“symbol”属性以及每个符号条目的嵌套“created by”和“updated by”(user.username)属性。结果表应如下所示:

symbol     created_by    updated_by
------------------------------------
symbol1    username1     username2
symbol2    username1     username2
我怎样才能做到这一点?我想我需要
接受:user
的嵌套属性,并且可能
在我的符号模型中有一个:user
(?)。我的用户模型中是否也需要
属于:user

正确设置模型后,如何访问视图中与“created_by_id”和“Update_by_id”关联的用户的用户名

我有一个编辑表单,其中使用了如下嵌套表单(很好):


符号:
意思是:
奥诺米:
库尼奥米:
但我不知道如何在这种情况下做类似的事情,我有两个嵌套属性与同一个符号关联

我是rails的新手,所以也许我完全知道如何做错事。如果有比我刚才解释的更好的方法,请纠正我

编辑:以下是模型。第一个实际上被称为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
classjsymbol:destroy
has_one:radial,:dependent=>:destroy
有一个:词汇,:dependent=>:destroy
属性可访问性:由\u id创建,:由\u id更新,:符号,:j\u符号\u类型\u id,:级别
属性可访问:汉字属性,:部首属性,:词汇属性
接受:汉字、:部首、:词汇的\u嵌套\u属性\u
结束
以及用户模型

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
class用户true,:university=>true
结束

这当然没有用户jsymbol关系,因为我不确定要在其中添加什么类型的关系。。它应该类似于JSymbol模型中的
has_one:user
,而用户模型中的
属于:j_symbol
,除非它需要以某种方式执行两次。。还有一个问题是在每个符号的操作方法中调用.build方法。

类似的方法应该可以工作:

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
尽管如此,我还是在我的应用程序上尝试了这个,所以我不能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
类符号User,:foreign\u key=>“created\u by\u id”
有一个:更新程序,:class\u name=>User,:foreign\u key=>'updated\u by\u id'
结束
当我意识到我可以在这里使用外键参数后,我开始在谷歌上搜索“rails多个外键到同一个表”,偶然发现了一堆过时的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"
这一个来自用户模型:

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

可能不是最好的方法,我用sendind值解决了这个问题,找到用户并返回该用户的名称。是的,我想到了,但是对于一个包含10个项目的页面,我只会执行20 db查询来获取所有用户名。。所以这是我最后的选择。谢谢你的回答。请发布
用户
符号
模型,它们之间有关系的部分我将模型添加到问题中,我将尝试一下。您是否在action方法中添加了任何内容来获取这些用户?不确定您的情况下应该是什么,
有一个
有多个
,这取决于您的应用程序。+1帮助我正确理解外键想法。
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 %>
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