【问题标题】:RAILS Can't anymore add article in my db after making somes changes (fk)RAILS 进行一些更改后,不能再在我的数据库中添加文章(fk)
【发布时间】:2018-05-23 15:25:37
【问题描述】:

创建 user_activities 表时,我添加了一些外键,因为我无法再创建任何活动,并且 rails 不会给我错误, 这是我的代码

表格:

  <div class="form-group">
    <%= f.input :title, label: "Titre (optionnel)", class: "form-control" %>
  </div>

  <div class="form-group">
    <%= f.label :content, 'Contenu (requis)' %>
    <%= f.text_area :content, id: "wysiwyg" %>
  </div>

  <div class="form-group">
    <%= f.input :group_id, prompt: "- Choisir un groupe (requis) -", label: false, collection: current_user.groups.order('name') %>
  </div>

  <div class="form-group">
    <%= f.button :submit, @activity.new_record? ? "Créer l'activité" : "Mettre à jour l'activité", class: "btn btn-outline-primary btn-sm" %>
  </div>

活动控制器

  def create
    @activity = Activity.new(activity_params)
    @activity.user = current_user
    if @activity.save
      flash[:notice] = "Votre activité a été créée !"
      redirect_to root_path
    else
      flash[:alert] = "Erreur lors la création"
      redirect_to root_path
    end
  end

  def activity_params
    params.require(:activity).permit(:content, :title, :group_id)
  end

型号:

# useractivity
  belongs_to :activity
  belongs_to :user
  validates :user, uniqueness: { scope: :activity }
# user
  has_many :user_activities
  has_many :activities
  has_many :activities, through: :user_activities
# Activity
  has_many :user_activities, dependent: :destroy
  belongs_to :category
  has_many :users, through: :user_activities
  belongs_to :user
  validates :content, presence: true

追踪:

Started POST "/activities" for 127.0.0.1 at 2018-05-24 09:38:18 +0200
Processing by ActivitiesController#create as JS
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"j1AMcsR16eBMf+6nTO9NN17NE7Qhz0DS07hu+w1YtYopYcwaRbQw6ThkCK3RQ0wY5MqNxM7Fe9VXezSHAZgUnw==", "activity"=>{"title"=>"TESTTITLE", "content"=>"<p>TESTCONTENT</p>", "group_id"=>"1"}, "commit"=>"Créer l'activité"}
  User Load (2.9ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 2], ["LIMIT", 1]]
  ↳ /home/benjamin/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0.rc1/lib/active_record/log_subscriber.rb:98
   (4.1ms)  BEGIN
  ↳ app/controllers/activities_controller.rb:9
  Group Load (0.5ms)  SELECT  "groups".* FROM "groups" WHERE "groups"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/activities_controller.rb:9
   (0.2ms)  ROLLBACK
  ↳ app/controllers/activities_controller.rb:9
Redirected to http://localhost:3000/
Completed 200 OK in 22ms (ActiveRecord: 8.0ms)

控制器:

  def create
    @activity = Activity.new(activity_params)
    @activity.user = current_user
       #line 9 ---->
    if @activity.save
      flash[:notice] = "Votre activité a été créée !"
      redirect_to root_path
    else
      flash[:alert] = "Erreur lors la création"
      redirect_to root_path
    end
  end

【问题讨论】:

  • 请发布您在日志中遇到的错误
  • 这里有冲突:has_many :activities; has_many :activities, through: :user_activities。您定义了 activities 关系两次。尝试重命名其中的第一个(您需要指定class_name)并坚持使用through 行。如果您只打算使用 has_many through 关系,则可以完全删除它。
  • 我已做出更改,但我无法添加或编辑一项活动:/

标签: ruby-on-rails ruby database foreign-keys


【解决方案1】:

为了扩展我的评论,您定义了用户和活动之间的关系两次,这会导致问题,在这里:

# user.rb
has_many :activities

# activity.rb
belongs_to :user

还有:

# user.rb
has_many :user_activities
has_many :activities, through: :user_activities

# activity.rb
has_many :user_activities, dependent: :destroy
has_many :users, through: :user_activities

这意味着调用user.activities 时会发生冲突,因为它正在查看两个不同的关联:has_many - belongs tohas_many through。前者是一对多,后者是多对多。

这并不是说这是不好的做法,只是您需要确保命名不会冲突。我不确定这种关系的性质以及您希望实现的目标,但类似以下内容可以解决此问题:

# user.rb
has_many :created_activities, class_name: 'Activity'

has_many :user_activities
has_many :activities, through: :user_activities

# activity.rb
has_many :user_activities, dependent: :destroy
has_many :users, through: :user_activities

belongs_to :master_user, class_name: 'User'

这会更新您的代码以允许您调用以下内容:

user.created_activities # has_many
user.activities # has_many through

activity.master_user # belongs_to
activity.users # has_many through

显然,您可以以不同的方式命名关联,也可以重命名has_many through 关系以增加清晰度。

The docs 这里有点重,但值得花时间了解 - 如果您的列名与约定不同,还有其他选项,例如 foreign_key

希望对您有所帮助 - 如果您有任何问题,请大声告诉我 :)

【讨论】:

  • 嗨,谢谢我刚刚在下面发布了新答案,因为我无法编辑我的帖子以进行更改:/(对不起,如果我犯了一些英语错误)
  • 谢谢@BenjaminBarbé - 看起来你正朝着正确的方向前进。您的新跟踪表明您在保存 activity 时遇到问题,这可能是由于验证或传递给控制器​​的数据所致。我建议提出一个专门与此相关的新问题(请随时在下面@我,我会尽我所能提供帮助)并且——如果你认为这有帮助——在回答这个问题时打勾:)
  • 好的,谢谢:有新帖子 :) stackoverflow.com/questions/50513153/…
猜你喜欢
  • 2014-04-15
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多