- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我目前正在尝试构建一个类似于 Trello 的应用程序.我有可以创建 boards
的 users
。每个用户都可以拥有不同的角色
,具体取决于他们所在的版 block 。因为我是 Rails 的新手,所以我只想确保我遵循“Rails 方式”和最佳实践。这是我的架构:
create_table "boards", force: :cascade do |t|
t.string "title"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "user_boards", force: :cascade do |t|
t.integer "user_id"
t.integer "board_id"
t.integer "role"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "users", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.inet "current_sign_in_ip"
t.inet "last_sign_in_ip"
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
add_foreign_key "lists", "boards"
如您所见,我将 role
属性添加到 UserBoard
连接表。一个 User has_many Boards
和 Board has_many Users
都 through: UserBoard
。根据用户
和董事会
,他们可以有不同的角色
。
用户板.rb
class UserBoard < ApplicationRecord
belongs_to :user
belongs_to :board
enum role: { admin: 0, member: 1 }
end
用户.rb
class User < ApplicationRecord
has_many :user_boards
has_many :boards, through: :user_boards
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
validates :name, presence: true, length: { maximum: 50 }
validates :email, presence: true
end
棋盘.rb
class Board < ApplicationRecord
has_many :user_boards
has_many :users, through: :user_boards
has_many :lists, dependent: :destroy
include AssociateUsersToBoards
def self.assign_board_to_user(user, board)
AssociateUsersToBoards.build_association(user, board)
end
end
我只是想弄清楚这是否是处理此问题的最佳方法,以及是否有更好的方法来设置它,以便我的查询和更新可以更清晰一些。现在,当 User
创建一个 Board
时,您可以看到我正在使用 ActiveRecord:create
函数。我使用 create
的原因是因为当我尝试使用 new
或 build
时,连接表中的关联没有得到。这对我来说似乎是错误的,我将无法执行 current_user.boards.new(board_params)
或 current_user.boards.build(board_params)
:
def create
@board = current_user.boards.new(board_params)
respond_to do |format|
if current_user.save
format.html { redirect_to @board, notice: 'Board was successfully created.' }
format.json { render :show, status: :created, location: @board }
else
format.html { render :new }
format.json { render json: @board.errors, status: :unprocessable_entity }
end
end
end
但我还想将 role
设置为 admin
.. 我能想到的唯一方法是 current_user.user_boards.find_by(board_id: @board).update_attribute(:role, 'admin')
在我将记录保存到我的 board#create
操作之后。这个查询有点让我想吐,我不敢相信没有更好的方法。
我的 board_params
非常简单 & 只允许基本标题:
def board_params
params.require(:board).permit(:title)
end
我还想添加我用来提交 board
的表单,以确保其中没有任何错误:
<div class="modal-body">
<%= form_with(model: board, local: true) do |form| %>
<% if board.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(board.errors.count, "error") %> prohibited this board from being saved:</h2>
<ul>
<% board.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="form-group">
<%= form.label :title %><br/>
<%= form.text_field :title, autofocus: true, class: 'form-control' %>
</div>
<div class="actions">
<%= form.submit 'Create Board', class: 'btn btn-small btn-success btn-block' %>
</div>
<% end %>
</div>
非常感谢所有建议、提示和建设性批评,因为我尝试越来越多地学习/熟悉 Ruby 语言和 Rails 框架。
最佳答案
你没有显示 board_params
,但也许它看起来应该是这样的:
def board_params
params.require(:board).permit(:something, :whatever_else).merge!(role: :admin)
end
然后,做类似的事情:
def create
@board = current_user.boards.new(board_params)
respond_to do |format|
if @board.save
format.html { redirect_to @board, notice: 'Board was successfully created.' }
format.json { render :show, status: :created, location: @board }
else
format.html { render :new }
format.json { render json: @board.errors, status: :unprocessable_entity }
end
end
end
这应该会创建一个正确设置了 user_id
和 role
的新看板。
顺便说一句,我个人更喜欢:
class UserBoard < ApplicationRecord
belongs_to :user
belongs_to :board
enum role: {
admin: 0,
member: 1
}
end
所以我不必担心 enum
在数组中的位置,如 docs 中讨论的那样:
Note that when an array is used, the implicit mapping from the values to database integers is derived from the order the values appear in the array. In the example, :active is mapped to 0 as it's the first element, and :archived is mapped to 1. In general, the i-th element is mapped to i-1 in the database.
Therefore, once a value is added to the enum array, its position in the array must be maintained, and new values should only be added to the end of the array. To remove unused values, the explicit hash syntax should be used.
关于ruby-on-rails - Ruby on Rails ActiveRecord 数据流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50647916/
我想知道如何使用 CaSTLe AR 来“播种”自动递增的主键值?例如,希望 Orders 表的主键从 10000 开始。这是 1. 可能的 2. 创建订单号的好解决方案吗? 也许有一种方法可以在不是
假设你想 records = Model.all records.to_a.map{|m| m.serializable_hash(:root => true)} 就像 to_json(:root =
我目前正在尝试开发一个插件/gem 来观察多个模型。理想情况下,观察者应该只用一个单例方法自动实例化...... class MyModel true observe ActiveRecord:
使用 Mysql 我可以使用 COALESCE仅更新表中为空的值。 我怎样才能用 Rails (ActiveRecord) 做到这一点? 我不想创建 if表中每一列的语句,我猜如果我将 ActiveR
我从 Yii2 开始,想要将一些内容保存到我的数据库中。这是我的模型: class Course extends ActiveRecord { public $name; public
我正在开始一个新项目,最近我发现了 caSTLe 项目 activerecord,这似乎是一个很棒的解决方案,但与此同时,它看起来确实是非常规的。我想知道,这种感觉是来自学习新东西(我应该习惯它)还是
不知何故,我总是在周五收到这些。 我之前的问题是关于同样的问题,但我现在可以缩小范围: 我一整天都在研究这个问题,试图理解它。我有一个带有 lock_version 列的表,如此指定: add_col
我正在使用表中缓存的关键字构建搜索。在表中查找用户输入的关键字之前,它会被规范化。例如,删除了一些标点符号,如“-”,并标准化了大小写。然后使用规范化的关键字来查找获取搜索结果。 我目前正在使用 be
我有以下类用于“项目”和“颜色”之间的多对多关系。 并且“项目”不应该有重复的“颜色”,例如:-如果“Item1”有“Blue”和“Red”,那么我们不能向“Item1”添加另一个“Red” 这是正确
我对 Yii2 事件记录处理关系属性的方式感到困惑。是否可以将事件记录对象链接到另一个对象而不先保存它? 例如,我想将图像作为 Logo 添加到公司记录中,但尚未决定是否应保存这两个记录。给定一家公司
我决定使用 Castle ActiveRecord 为客户制作一个系统,一切都很顺利,直到我发现交易不起作用,例如; TransactionScope t = new T
Yii2 的新特性。 只是试图从 ActiveRecord 查询中获得返回。我意识到使用 Yii2 约定可能有更简单的方法来做到这一点 public function actionGet_permis
我收到一个错误(在 Sinatra + ActiveRecord Heroku 上)数据库配置没有指定适配器。 根据一些研究,这似乎是因为 Heroku 预计在 rackup 期间不使用环境变量。 我
我正在尝试按“created_at”日期查找记录 - 数据库列类型为“日期时间”并且 我正在使用来自 jQuery 的 UI DatePicker 我的网址如下所示:“localhost:3000/u
我想问这个问题。但我认为 BlameableBehavior和 TimestampBevavior可能是需要这样做的好例子: 我必须做什么才能使属性只能从 ActiveRecord 对象的外部读取而不
这是一个古老的问题,其中给定一个具有“类型”、“品种”和“价格”属性的表,您可以获取每种类型的最低价格的记录。 在 SQL 中,我们可以做 this通过: select f.type, f.varie
这似乎是一个微不足道的问题,但是我能想到的所有明显的解决方案都有自己的缺陷。 我们想要的是能够为新记录设置任何默认的 ActiveRecord 属性值,以使其在验证之前和期间可读并且不干扰用于搜索的派
做关联方法,比如has_many定义的那些和 belongs_to利用 ActiveRecord::Relation ? 如果是这样,是否有可能获得 ActiveRecord::Relation正在使
如何将 MySQL 的 WHERE 转换为 ActiveRecord :condition? SELECT * FROM users WHERE LENGTH(users.last_name) [
当使用带有 ActiveRecord T4 模板的 SubSonic 3 时,生成的代码会显示许多关于 CLS 合规性、未使用的项目和缺少 GetHashCode() 实现的警告。 为了避免它们,我做
我是一名优秀的程序员,十分优秀!