从集合中选择外来值

时间:2014-10-29 16:48:42

标签: ruby-on-rails ruby ruby-on-rails-4 many-to-many

我有3个参与者,测试用户和任务,参与者通过多对多关系连接测试用户和任务。现在我的问题:为什么可以通过“test.ids”检索所有ID,而不是通过“test.testuser_ids”检索testuser_ids(如下面的rails控制台输出中所示)?

schema.rb

ActiveRecord::Schema.define(version: 20141027151350) do

  create_table "attendees", force: true do |t|
    t.integer  "task_id"
    t.integer  "testuser_id"
    t.boolean  "participate"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "tasks", force: true do |t|
    t.string   "title"
    t.text     "text"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.datetime "task_date"
    t.boolean  "participate"
  end

  create_table "testusers", force: true do |t|
    t.string   "username"
    t.datetime "created_at"
    t.datetime "updated_at"
  end    
end

rails console:

irb(main):030:0> test = Attendee.all
  Attendee Load (0.2ms)  SELECT "attendees".* FROM "attendees"
=> #<ActiveRecord::Relation [#<Attendee id: 1, task_id: 1, testuser_id: 1, participate: true, created_at: "2014-10-29 16:29:43", updated_at: "2014-10-29 16:29:43">, #<Attendee id: 2, task_id: 1, testuser_id: 2, participate: true, created_at: "2014-10-29 16:29:43", updated_at: "2014-10-29 16:29:43">, #<Attendee id: 3, task_id: 1, testuser_id: 3, participate: nil, created_at: "2014-10-29 16:29:43", updated_at: "2014-10-29 16:29:43">, #<Attendee id: 4, task_id: 1, testuser_id: 4, participate: nil, created_at: "2014-10-29 16:29:43", updated_at: "2014-10-29 16:29:43">]>
irb(main):031:0> test.ids
   (0.2ms)  SELECT "attendees"."id" FROM "attendees"
=> [1, 2, 3, 4]
irb(main):032:0> test.testuser_ids
NoMethodError: undefined method `testuser_ids' for #<Attendee::ActiveRecord_Relation:0x00000106011ab0>

2 个答案:

答案 0 :(得分:1)

是不可能的,因为默认情况下Rails不会按照您的意愿提供它。 即使我不确定我有什么想做的,但我认为其中一个是你的解决方案:

Attendee.all.first.testusers.ids

这将获得特定与会者的所有testusers ID。 相反,如果您想要所有与会者的所有testusers ID,您将需要一个循环:

res = []
Attendee.all.each { |a| res += a.testusers.ids }
res.uniq

答案 1 :(得分:0)

您似乎错过了Attendee模型的关联。它应该有:

class Attendee

  belongs_to :testuser

end

此外,由于Attendee.first.testuser_ids表格有attendees,因此无法致电testuser_id。否则,请更改模型架构。