使用new()与create()创建关联

时间:2015-06-18 02:40:39

标签: ruby-on-rails ruby-on-rails-4 associations activemodel

我希望这个问题能够让我更多地了解如何与外来钥匙建立多对多的关系,这些外键不会有无法使用的魔法" Rails魔法"我已经谷歌搜索了几个小时,但仍然没有完全理解。

基本上,Users可以组织EventsEvents可以组织Users

我有以下型号:

class User < ActiveRecord::Base
  has_many :event_organizers, foreign_key: "organizer_id"
  has_many :organized_events, through: :event_organizers, source: "event"
class EventOrganizer < ActiveRecord::Base
  belongs_to :event
  belongs_to :organizer, class_name: "User", foreign_key: "organizer_id"
class Event < ActiveRecord::Base
  has_many :event_organizers
  has_many :organizers, through: :event_organizers

如果您对event_organizers上的列有疑问:

event_organizers
  event_id (references an event)
  organizer_id (references a user)

现在到了有趣的部分,我注意到它发生在我的控制器中,但会在控制台中显示,以使这篇文章更短:

2.2.0 :001 > User.first
  User Load (0.1ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
 => #<User id: 1, email: "test@test.com", password_digest: "$2a$10$SCOFgQTF4krBYlqKVHSSMOtVP8ad/vTFPN/60WjX8s....", first_name: "test", last_name: "user", admin: false, created_at: "2015-06-18 02:36:21", updated_at: "2015-06-18 02:36:21"> 

2.2.0 :002 > event = User.first.organized_events.new( name: "test", location: "test", start_time: Time.now, end_time: 2.hours.from_now )
  User Load (0.2ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
 => #<Event id: nil, name: "test", location: "test", start_time: "2015-06-18 02:37:15", end_time: "2015-06-18 04:37:15", created_at: nil, updated_at: nil> 

2.2.0 :003 > event.organizers
 => #<ActiveRecord::Associations::CollectionProxy []> 

2.2.0 :004 > event = User.first.organized_events.create( name: "test", location: "test", start_time: Time.now, end_time: 2.hours.from_now )
  User Load (0.5ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
   (0.2ms)  begin transaction
  SQL (0.3ms)  INSERT INTO "events" ("name", "location", "start_time", "end_time", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?)  [["name", "test"], ["location", "test"], ["start_time", "2015-06-18 02:37:37.781981"], ["end_time", "2015-06-18 04:37:37.782003"], ["created_at", "2015-06-18 02:37:37.788761"], ["updated_at", "2015-06-18 02:37:37.788761"]]
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
  EventOrganizer Exists (0.1ms)  SELECT  1 AS one FROM "event_organizers" WHERE ("event_organizers"."organizer_id" = 1 AND "event_organizers"."event_id" = 1) LIMIT 1
  SQL (0.1ms)  INSERT INTO "event_organizers" ("organizer_id", "event_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["organizer_id", 1], ["event_id", 1], ["created_at", "2015-06-18 02:37:37.800400"], ["updated_at", "2015-06-18 02:37:37.800400"]]
   (37.2ms)  commit transaction
 => #<Event id: 1, name: "test", location: "test", start_time: "2015-06-18 02:37:37", end_time: "2015-06-18 04:37:37", created_at: "2015-06-18 02:37:37", updated_at: "2015-06-18 02:37:37"> 

2.2.0 :005 > event.organizers
  User Load (0.6ms)  SELECT "users".* FROM "users" INNER JOIN "event_organizers" ON "users"."id" = "event_organizers"."organizer_id" WHERE "event_organizers"."event_id" = ?  [["event_id", 1]]
 => #<ActiveRecord::Associations::CollectionProxy [#<User id: 1, email: "test@test.com", password_digest: "$2a$10$SCOFgQTF4krBYlqKVHSSMOtVP8ad/vTFPN/60WjX8s....", first_name: "test", last_name: "user", admin: false, created_at: "2015-06-18 02:36:21", updated_at: "2015-06-18 02:36:21">]> 

所以,我的问题是:为什么当我使用user.organized_events.new()时,关联不存在,但当我使用user.organized_events.create()时,它确实存在?

2 个答案:

答案 0 :(得分:1)

您可以注意到,当您使用&#39; new&#39;时,不会生成新事件的ID。记录的id仅在保存到数据库时生成,并且只有在您没有明确提及任何其他属性时才通过其ID链接两个记录。由于尚未为新事件生成任何ID,因此无法将用户链接到该事件。因此,当您使用查询&#39; event.organizers&#39;时,您将获得一个空数组。

答案 1 :(得分:0)

这是我的坏事。我应该更仔细地阅读你的问题。

您正在使用event.organizers。我想这是因为你必须在你的模型中设置inverse_of。