1

我有一个User模型,has_many Venues我希望允许用户阻止场地,这样他们就不会在默认场地列表(显示所有内容)中看到它。

在开始编写代码之前,我现在正在查看文档/教程,但我想我会在这里寻求任何建议或建议。一旦我建立了关系,我将发布代码,以便其他从事类似工作的人可以看到它。

目前这两个模型如下所示:

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation, :remember_me
  has_many :venues, :dependent => :destroy
end

class Venue < ActiveRecord::Base
  attr_accessible :name, :address
  belongs_to :user
end

和场地控制器:

class VenuesController < ApplicationController
  def index
    @venues = Venue.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @venues }
    end
  end
end
4

2 回答 2

2

您需要join_model具有以下属性的 a:user_idvenue_idblacklisted

例如,我会给它命名,JoinModel但我相信你会找到一个更好的名字。

1. 生成连接模型

rails g model join_model user:references venue:references blacklisted:boolean

在迁移文件中,将默认值添加到列入黑名单的字段:

class CreateJoinModels < ActiveRecord::Migration
  def change
    create_table :join_models do |t|
      t.references :user, index: true
      t.references :venue, index: true
      t.boolean :blacklisted, default: false

      t.timestamps
    end
  end
end

迁移:rake db:migrate

2.设置关系

class Venue < ActiveRecord::Base
  has_many :join_models
  has_many :users, through: :join_models
end

class User < ActiveRecord::Base
  has_many :join_models
  has_many :venues, through: :join_models
end

class JoinModel < ActiveRecord::Base
  belongs_to :user
  belongs_to :venue
end

3.不要选择列入黑名单的join_models

class User < ActiveRecord::Base
  has_many :join_models, -> { where(blacklisted: false) }
  # ... 
end

这样,@venues = current_user.venues或者@users = User.includes(:venues)不会为这个/这些用户返回列入黑名单的场所。

选择

如果需要直接调用,可以直接在模型Venue.all上设置一个默认作用域:Venue

class Venue < ActiveRecord::Base
  # ...
  default_scope { joins(:join_models).where(join_models: { blacklisted: false }) }
end

这样,Venue.all清除列入黑名单的场所。User.first.venues仅返回未列入黑名单的场所。

于 2013-09-05T21:53:18.890 回答
1

您应该创建新模型,为黑名单提供场地和用户之间的多对多关系。然后只剩下需要的场地

blacklisted_venues = User.find(params[:id]).blacklisted_venues
@venues = Venue.all.to_a - blacklisted_venues
于 2013-09-05T19:52:31.137 回答