Rails - 多重关联未知属性
Rails - multiple association unknown attribute
我正在 Rails 中创建一个 API,并且有一个名为 Match 的模型,它与定义为
的用户模型有 2 个关联
belongs_to :user_a, class_name: 'User', foreign_key: 'user_a'
belongs_to :user_b, class_name: 'User', foreign_key: 'user_b'
在用户模型中:
has_many :matches
在我的 Match 控制器规范中,我正在执行以下操作:
before(:each) do
user = FactoryGirl.create :user
api_authorization_header user.auth_token
@match_attribs = FactoryGirl.attributes_for :match
post :create, { match: @match_attribs }
end
并且测试失败 "unknown attribute: user_id"
如果我对 post 进行更改:
post :create, { user_a: user.id, user_b: user.id, match: @match_attribs }
然后它仍然给我未知的属性。
编辑:匹配方案:
create_table "matches", force: true do |t|
t.integer "user_a"
t.integer "user_b"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "matches", ["user_a"], name: "index_matches_on_user_a"
add_index "matches", ["user_b"], name: "index_matches_on_user_b"
感谢您的帮助
我知道如何让它与您的模式一起工作的唯一方法是放入用户模型:
has_many :matches_as_a, foreign_key: 'user_a'
has_many :matches_as_b, foreign_key: 'user_b'
def matches
matches_as_a + matches_as_b
end
如果有其他方法,我会很高兴知道它并重构我的一些应用程序(当然不包括连接模型);)
Rails 和 SQL 约定规定外键应以 _id
结尾,例如user_a_id
、user_b_id
。由于 Rails 是围绕 "convention over configuration," 构建的,约定将使您的代码更简单。如果更改字段名称,代码将变为:
match.rb
belongs_to :user_a, class_name: "User"
belongs_to :user_b, class_name: "User"
user.rb
has_many :matches_a, class_name: 'Match', foreign_key: 'user_a_id'
has_many :matches_b, class_name: 'Match', foreign_key: 'user_b_id'
def matches
Match.where("user_a_id = :id OR user_b_id = :id", id: id)
end
只有使用方法才能建立这种关系。这种方式将 return 一个您可以进一步查询的关系,而简单地连接其他两个关系 (matches_a + matches_b
) 将 return 一个数组。
我正在 Rails 中创建一个 API,并且有一个名为 Match 的模型,它与定义为
的用户模型有 2 个关联belongs_to :user_a, class_name: 'User', foreign_key: 'user_a'
belongs_to :user_b, class_name: 'User', foreign_key: 'user_b'
在用户模型中:
has_many :matches
在我的 Match 控制器规范中,我正在执行以下操作:
before(:each) do
user = FactoryGirl.create :user
api_authorization_header user.auth_token
@match_attribs = FactoryGirl.attributes_for :match
post :create, { match: @match_attribs }
end
并且测试失败 "unknown attribute: user_id"
如果我对 post 进行更改:
post :create, { user_a: user.id, user_b: user.id, match: @match_attribs }
然后它仍然给我未知的属性。
编辑:匹配方案:
create_table "matches", force: true do |t|
t.integer "user_a"
t.integer "user_b"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "matches", ["user_a"], name: "index_matches_on_user_a"
add_index "matches", ["user_b"], name: "index_matches_on_user_b"
感谢您的帮助
我知道如何让它与您的模式一起工作的唯一方法是放入用户模型:
has_many :matches_as_a, foreign_key: 'user_a'
has_many :matches_as_b, foreign_key: 'user_b'
def matches
matches_as_a + matches_as_b
end
如果有其他方法,我会很高兴知道它并重构我的一些应用程序(当然不包括连接模型);)
Rails 和 SQL 约定规定外键应以 _id
结尾,例如user_a_id
、user_b_id
。由于 Rails 是围绕 "convention over configuration," 构建的,约定将使您的代码更简单。如果更改字段名称,代码将变为:
match.rb
belongs_to :user_a, class_name: "User"
belongs_to :user_b, class_name: "User"
user.rb
has_many :matches_a, class_name: 'Match', foreign_key: 'user_a_id'
has_many :matches_b, class_name: 'Match', foreign_key: 'user_b_id'
def matches
Match.where("user_a_id = :id OR user_b_id = :id", id: id)
end
只有使用方法才能建立这种关系。这种方式将 return 一个您可以进一步查询的关系,而简单地连接其他两个关系 (matches_a + matches_b
) 将 return 一个数组。