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

但我不知道在这种情况下如何做类似的事情,我有两个与同一个符号关联的嵌套属性。

我是 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

和用户模型。

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

这当然没有 user-jsymbol 关系,因为我不确定要在其中添加什么样的关系。它应该类似于has_one :userJSymbol 模型和belongs_to :j_symbolUser 模型中的东西,除了它需要以某种方式完成两次。还有在每个 Symbol 的 action 方法中调用 .build 方法的问题。

4

2 回答 2

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
于 2013-06-30T20:47:14.210 回答
0

rmagnum2002让我意识到我可以在这里使用 foreign_key 参数之后,我开始在谷歌上搜索“rails multiple foreign key to same table”,偶然发现了一堆不起作用的过时 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 %>

如果有人感兴趣,这就是在 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 回答