Ruby on rails 改进我的数据拉取以实现简单的;公告;rails应用程序

Ruby on rails 改进我的数据拉取以实现简单的;公告;rails应用程序,ruby-on-rails,Ruby On Rails,我正在为我所教的中学制作一个“公告”网络应用程序(调整给定的Twitter克隆) 当用户创建公告时,他们使用复选框确定该公告应显示给哪些级别(1-3个级别可能为真)。这是正确的,我把分数存储为布尔值 create_table "announcements", :force => true do |t| t.string "content" t.integer "user_id" t.boolean "grade_6" t.boolean "grade_7" t.boolean

我正在为我所教的中学制作一个“公告”网络应用程序(调整给定的Twitter克隆)

当用户创建公告时,他们使用复选框确定该公告应显示给哪些级别(1-3个级别可能为真)。这是正确的,我把分数存储为布尔值

create_table "announcements", :force => true do |t|
t.string   "content"
t.integer  "user_id"
t.boolean  "grade_6"
t.boolean  "grade_7"
t.boolean  "grade_8"
t.date     "start_date"
t.date     "end_date"
t.datetime "created_at"
t.datetime "updated_at"
结束

我的用户还有一个等级字段,它是一个整数。我想用它来让每个用户的主页显示他们成绩的公告

例:一名八年级教师的成绩为8。当他们登录时,他们的主页应该只显示等级为TRUE的公告

示例:校长的成绩为0。当他们登录时,他们的主页应该显示所有公告

我正在努力研究如何将整数user.grade值转换为布尔标志,以便从模型中提取公告

我正在编写的代码正在运行,但非常笨拙。请帮我做些更优雅的!如果你有更好的想法,我不喜欢这个db模型。(事实上,我真的不喜欢这个db模型,因为我正在对多个位置的分数进行硬编码)

#为主页拉取公告的代码
def供给
案件等级
当6
六级
...
其他的
全年级
结束
结束
#用于拉取成绩公告的示例函数
def等级6

公告。其中(“grade_6=?和start_date>=?和end_date设置此类关系的正确方法是通过has_many to使用多对多关系:

class Announcement < ActiveRecord::Base
  has_many :announcement_grades
  has_many :grades, :through => :announcement_grades
end

class AnnouncementGrades < ActiveRecord::Base
  belongs_to :grade
  belongs_to :announcement
end

class Grade < ActiveRecord::Base
  has_many :announcement_grades
  has_many :announcements, :through => :announcement_grades
end
因此,现在您只需找到您的成绩,然后致电公告进行筛选:

@grade = Grade.find(params[:id])
@announcements = @grade.announcements

因此,从建模的角度来看,这是正确的方法。此重构还需要考虑其他因素,因为您必须对表单和控制器进行重大更改以支持此范式,但如果您决定将其他类型的对象附加到gr,这也将允许更大的灵活性和健壮性ade除了公告之外。演示如何使用嵌套表单元素通过单个表单管理多个模型,这将有助于您在将更改应用到模型后保持外观和感觉不变。我希望这会有所帮助,如果您需要更多帮助,请告诉我,这将是一项工作,但最终还是值得的。

Chris的例子在理论上是优越的。但是,如果1)你知道你的应用程序不会变得更复杂,2)美国的k-12系统将继续存在(我敢打赌…),那么你原来的模式可能会更实用。如果你更愿意坚持你已经拥有的模式,你可以对代码做一些改进:

让我们为您的发布模型添加一个“grade”范围

class Announcement < ActiveRecord::Base
  ....
  scope :grade, lambda do |num|
    num > 0 ? where("grade_#{num} = ?", true) : where('1=1')
  end
  ....
end
课程公告0?其中(“grade_#{num}=?”,true):其中('1=1')
结束
....
结束
这将允许更简单的编码,例如

teacher = User.find(user_id)
announcements = Announcement.grade(teacher.grade).where('start_date >= :today AND end_date <= :today', {:today => Date.today})
teacher=User.find(用户id)

公告=公告。成绩(教师。成绩)。地点('start\u date>=:today AND end\u date谢谢,Chris!不幸的是,我没有足够的因果报应来投票支持你,但这正是我想要的(“rails way”与我的hacky way)。没问题,丹尼尔,如果你有其他问题,请随时直接与我联系。你可以接受答案,你会因此得到一枚徽章,这是投票箭头下方的复选标记Shi Chris-再次感谢你的帮助。你有什么建议可以将此设置为一种“拥有”和“属于”许多关系,并放弃ann吗你的成绩表?我不认为我自己在公布成绩方面做得太多(除了加入)。将其设置为habtm非常简单,如下所述:。但是,我设置的每个habtm关系在某个时候都会发生变化,因为habtm没有灵活性。您仍然需要创建联接表,但没有模型来管理它,并且不能在其中存储任何其他列。它将只是pk的fr这也很有帮助!我将使用Chris的想法(因为我想我会从重构中学到很多),但我非常喜欢你更优雅的技巧。“where('1=1'))这是一个有趣的黑客行为——在编写SQL/db代码时,这是一件常见的事情吗?在紧要关头,这并非闻所未闻。在这种情况下,只有当这是一个必须在明天完成的又快又脏的项目时,这才是合适的。但如果你将此作为一个学习机会,那么我强烈建议你遵循Chris的建议,并“正确”地去做事实上,您总是必须根据资源约束来权衡体系结构决策。这样做本身并没有错,只是不够灵活,更容易实现
class Announcement < ActiveRecord::Base
  ....
  scope :grade, lambda do |num|
    num > 0 ? where("grade_#{num} = ?", true) : where('1=1')
  end
  ....
end
teacher = User.find(user_id)
announcements = Announcement.grade(teacher.grade).where('start_date >= :today AND end_date <= :today', {:today => Date.today})