Rails - 多个关联未知属性

时间:2015-07-22 16:52:55

标签: ruby-on-rails ruby database associations

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

在我的匹配控制器规范中,我正在执行以下操作:

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

并且测试失败,其中包含"未知属性:user_id"

如果我将更改发布到:

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"

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

我知道如何使其适用于您的架构的唯一方法是放入用户模型:

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

如果还有其他方式,我很高兴知道它并重构我的一些应用程序(当然不包括连接模型);)

答案 1 :(得分:1)

Rails和SQL约定规定外键应以_id结尾,例如user_a_iduser_b_id。由于Rails是围绕“约定优于配置”构建的,因此约定将使您的代码更简单。如果更改字段名称,则代码变为:

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

使用方法是建立这种关系的唯一方法。这种方式将返回一个可以进一步查询的关系,而简单地连接其他两个关系(matches_a + matches_b)将返回一个数组。